Swing in JavaFX einbinden

JeromeC

Aktives Mitglied
Hey Leute,

wir arbeiten in einem Projekt mit JavaFX als grafische Oberfläche.
Ich nutze DSJ zum Einholen von Webcam-Bildern. Diese werden mir auf einem JPanel geliefert.
Jetzt würde ich dieses JPanel gerne in JavaFX einbinden, finde aber keine Möglichkeit.

Soetwas funktioniert leider nicht:
Java:
DSCapture graph = new DSCapture(DSFiltergraph.DD7, dsi[0][0], false, DSFilterInfo.doNotRender(), this);
BorderPane pane = new BorderPane();
pane.setCenter(graph.asComponent());

asComponent() liefert Folgendes:
returns either the canvas DSFiltergraph extends or a JPanel it renders into

Hat Jemand einen Ansatz, dieses Problem zu lösen? Wäre euch sehr dankbar,
Grüße Jerome.
 
Hallo JeromeC,

1. JavaFX mit JFXPanel Komponente in Swing Anwendungen einbinden

versucht mal folgendes bzw. werft mal einen kurzen Blick auf den folgenden Link:

http://www.sourcetalk.de/2012/files/2012/09/JavaFX-Wolfgang-Weigend.pdf

Hintergrund: Entwickler sind meist keine guten UI-Designer. Deshalb ist es gut UI-Design und Entwicklung zu trennen. JavaFX 2.0 ist mit dem Versprechen angetreten dies zu vereinfachen. Aber wo sind die Tools?

Gerrit Grunwald, Anton Epple >> Folien der Source Talk Tage 2012 Die meisten Folien sind jetzt online:


Präsentationen | Source Talk Tage 2012

2. Ressourcen:

3. Beispiel:
Java:
java.awt.Component
java.awt.Container
private static void initFX(JFXPanel fxPanel) {
// This method is invoked on JavaFX thread
Scene scene = createScene();
fxPanel.setScene(scene);
}
JavaFX mit JFXPanel Komponente in 
Swing Anwendungen einbinden
public class Test {
private static void initAndShowGUI() {
// This method is invoked on Swing thread
JFrame frame = new JFrame("FX");
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
13 Copyright © 2012 Oracle and/or its affiliates. All rights reserved.
javax.swing.JComponent
javafx.embed.swing.JFXPanel
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initAndShowGUI();
}
});
}
}
frame.add(fxPanel);
frame.setVisible(true);
Platform.runLater(new Runnable() {
@Override
public void run() {
initFX(fxPanel);
}
});

4. Hello World in JavaFX Programming in Java

Java:
public class JavaFXExample extends Application {
@Override public void start(Stage stage){
Scene scene = new Scene(
LabelBuilder.create()
.text("Hello World!")
.layoutX(25)
22 Copyright © 2012 Oracle and/or its affiliates. All rights reserved.
.build());
stage.setTitle("Welcome to JavaFX!");
stage.setScene(scene);
stage.show();    
}
public static void main(String[] args) { 
launch(args); 
}
}
Ich hoffe, das hilft Dir/Euch erst mal weiter.

P.S. Wäre schön, wenn Ihr hier mal Euren Ansatz/Erfahrung postet. Der Bedarf in der Community ist sicher riesig!

Grüße,

OSBI_Fan

OSBI = Open Source Business Intelligence
 
Aber wo sind die Tools?

Hier z.B.: JavaFX Tools

Wobei ich selbst die normale JavaFX 2.2 API bevorzuge. Aber ich habe auch bei Swing keine GUI-Builder benutzt, außer um mal schnell was auszuprobieren...

Ansonsten kann man, wie du geschrieben hast JavaFX in Swing einbetten. Umgekehrt Swing in JavaFX einbetten geht nicht. Ist auch nicht gewollt, da Oracle möchte, dass die Leute auf JavaFX umsteigen.
 
Um überhaupt Webcam-Bilder in JavaFX einlesen zu können, haben wir uns von DSJ distanziert und es mit anderen Mitteln versucht. Folgende Lösung ist dabei herausgekommen:

1. OpenCV 2.42 extrahieren. Ich habe es unter "C:\Program Files\OpenCV"extrahiert
2. Zur Systemumgebungsvariable
C:\Program Files\OpenCV\build\common\tbb\intel64\vc10;C:\Program Files\OpenCV\build\x64\vc10\bin
hinzufügen. Das entscheidende ist tbb.dll in build\common\tbb\intel64\vc10
3. Microsoft Visual C++ 2010 Redistributable Package (x64) installieren: Download: Microsoft Visual C++ 2010 Redistributable Package (x64) - Microsoft Download Center - Download Details
4. Eclipse neu starten (vorsichtshalber, falls er bis dahin noch nicht die neuen Umgebungsvariablen eingelesen hat)
5. Neues Java-Project anlegen und dort einen lib-Folder
6. In lib kommen hinein:
javacpp.jar
javacv-windows-x86_64.jar
javacv.jar
7. Die JARs aus lib und die jfxrt.jar (findest Du in C:\Program Files\Java\jre7/lib) zum Build Path hinzufügen.
8. Package org.example Anlegen.
9. Die Klasse WebcamTest dort anlegen mit folgendem Quelltext:
Java:
package org.example;

import java.awt.image.BufferedImage;
import java.util.Timer;
import java.util.TimerTask;

import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.IplImage;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.DropShadow;
import javafx.scene.effect.PerspectiveTransform;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class WebcamTest extends Application {
    private OpenCVFrameGrabber grabber;
    private Timer timer;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        final ImageView view = new ImageView();

        final PerspectiveTransform transform = new PerspectiveTransform();
        transform.setUlx(10.0f);
        transform.setUly(10.0f);

        transform.setUrx(450.0f);
        transform.setUry(90.0f);

        transform.setLlx(10.0f);
        transform.setLly(480.0f);

        transform.setLrx(450.0f);
        transform.setLry(400.0f);

        final DropShadow shadow = new DropShadow();
        shadow.setInput(transform);
        shadow.setOffsetX(3.0);
        shadow.setOffsetY(6.0);
        shadow.setColor(Color.GRAY);
        shadow.setRadius(15.0);

        view.setEffect(shadow);

        final Group root = new Group();
        root.getChildren().add(view);
        final Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setWidth(800);
        stage.setHeight(600);
        stage.show();

        grabber = new OpenCVFrameGrabber(0);
        grabber.start();
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    final IplImage image = grabber.grab();
                    BufferedImage awtImage = image.getBufferedImage();
                    Image jfxImage = javafx.scene.image.Image
                            .impl_fromExternalImage(awtImage);
                    view.setImage(jfxImage);
                } catch (com.googlecode.javacv.FrameGrabber.Exception e) {
                }
            }
        }, 0, 1000 / 25);
    }

    @Override
    public void stop() throws Exception {
        super.stop();
        timer.cancel();
        grabber.stop();
    }
}

Ich danke meinen Vorredner für die Informationen und Tipps. Falls ihr noch andere Ansätze habt, wäre ich sehr erfreut sie zu erfahren.

Liebe Grüße, Jerome.

P.S.: Die hier Angegebe Lösung ist für x64-Plattformen.
P.P.S.: Habe gerade keine Möglichkeit gefunden, dem Thema einen Untertitel hinzuzufügen, aber sinnvoll wäre etwas zu ergänzen wie: "Webcam-Capture in JavaFX".
 
Zuletzt bearbeitet:

Zurück
Oben