JavaFX in Swing-Applikationen einbetten

maGG

Bekanntes Mitglied
darf man das?
'habe eine Beispiel gefunden:
Java:
import javax.swing.JFrame;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.web.WebView;


public class FXInSwing extends JFrame {

    private static final int WIDTH = 800;
    private static final int HEIGHT = 500;

    public FXInSwing() {
        initGUI();
    }

    public void initGUI() {
        final JFXPanel panel = new JFXPanel();
        this.add(panel);
        this.setTitle("JavaFX in Swing");
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setSize(WIDTH, HEIGHT);
        this.setLocationRelativeTo(null);
        // Lambda Java 8
        Platform.runLater(() -> initJFXPanel(panel));
        this.setVisible(true);
    }

    private void initJFXPanel(JFXPanel panel) {
        Scene scene = new Scene(new Browser(), WIDTH, HEIGHT);
        panel.setScene(scene);
    }

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

class Browser extends Pane {

    final WebView view = new WebView();

    public Browser() {
        view.getEngine().load("http://yourwebs.de");
        getChildren().add(view);
    }

    @Override
    protected void layoutChildren() {
        double w = getWidth();
        double h = getHeight();
        layoutInArea(view, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER);
    }
}
Da stand weiterhin folgendes:
Das gemeinsame Verwenden von JavaFX und Swing-Komponenten in einer Anwendung sollte nur in Ausnahmefällen in Erwägung gezogen werden, kann jedoch z.B. im Rahmen der Wartung und Erweiterung bestehender Anwendungen, gelegentlich sinnvoll oder sogar notwendig sein.
Mir ist aufgefallen, dass das Laden des Panels ziemlich lange dauert, ist das normal?
Habt ihr vielleicht ein Code Schnipsel, der für mich interessant sein könnte?
Ich würde gerne eine Vorschau Funktion für Html Code in mein Programm impementieren.
 
Ja, dass darf man. Ist sogar eine Strategie von Anfang an gewesen, um Nutzer von Swing und SWT zu überzeugen.
Das Problem ist jedoch, dass das JavaFX-Toolkit erst dann initialisiert wird, wenn es benötigt wird (hier, wenn du new JFXPanel() aufrufst, glaube ich.
Da du gleichzeitig mit Swing auch JavaFX und den Browser öffnest (WebKit-Engine wird geladen, weiss nicht, ob das auch noch Overhead mit sich bringt), wird dadurch vermutlich relativ viel Arbeit erzeugt. Du könntest dir ja einen Job machen, der das Laden der Webseite etwas verzögert - das könnte vielleicht etwas bringen. Aber sicher bin ich mir nicht.
Hier in deinem Beispiel öffnest du ja nur ein separates Fenster, dass du mit dem JavaFX-Zeug befüllst. Schon mal überlegt, ob du nicht an der Stelle lieber gleich ein reines JavaFX-Fenster erzeugen willst, statt es unbedingt in ein Swing-Frame zu zwingen? Vielleicht bringt das ja noch etwas? (In dem Fall noch hier ein Tipp, sollte es dich betreffen: https://stackoverflow.com/questions/11273773/javafx-2-1-toolkit-not-initialized)
 
Das kommt für mich leider nicht in Frage, da ich bisher alls in ein JFrame gepackt habe.

Ich habe so eine Art Vorschau Funktion, die in einer Textarea mit dem User kommuniziert. Jeder eingegebene String Wert in ein Textfield wird dort angezeigt, in einer gewissen Schablone/Darstellung/Formatierung. Ich habe also ein DocumentListener für jedes Texfield hinzugefügt und in den Listener dann meine Vorschau Methode.

Am Ende schreibt mein Programm eine txt, htm und bat Datei und kompremiert diese. Für die Htm Datei wäre eine zusätzliche Ansicht ganz schön. Das habe ich bisher mit der browse-Methode gelöst, die eine Fenster in meinem Standardprogramm öffnet und die Datei so anzeigt.
Es wäre natürlich noch eine Ecke cooler, wenn ich vor dem Erzeugen, diese Ansicht bereits hätte. Daher kam mir die Idee bzw. habe ich danach gegooglet und dann habe ich eben dieses JFXPanel gefunden.

Ich wollte es erst mal mit einem Popup-Fenster testen, also ob es funktioniert, wie es funktioniert, welche Optionen ich da habe. Und wenn es gut läuft evtl. die Textarea mit der Vorschau ganz auszutauschen und mein JFXPanel in mein JFrame reinlege und das dann so löse. Aber da bin ich mir jetzt unsicher, ob das Programm dann nicht immer länger laden müsste.
 
Ach so, verstehe, kein Problem. Ich dachte halt, da es ein Frame ist, dass du ein separates Fenster möchtest. Aber ich kann deiner Erklärung gut folgen. 😉

Na wie gesagt: Versuch mal, das Laden des HTMLs etwas zu verzögern. Bzw. lade mal keine Website sondern eine lokale HTML, vielleicht genügt das schon...

Die letzte Alternative: Ersetze Swing doch gleich mit JavaFX - ist IMHO eh das bessere Framework. 😀
 
Hier etwas Stoff zum Lesen...

Tutorials
http://docs.oracle.com/javase/8/javase-clienttechnologies.htm
http://code.makery.ch/library/javafx-8-tutorial/
https://jaxenter.de/java-tutorial-javafx-53878
http://tutorials.jenkov.com/javafx/index.html

Liste mit sonstigen JavaFX-Ressourcen (Blogs, 3rd-Party-Bibliotheken, etc.)
https://github.com/mhrimaz/AwesomeJavaFX

CSS
Oracle (offiziell): https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html
JDK-interne CSS (etwas älterer Build): https://gist.github.com/maxd/63691840fc372f22f470

#edit:
Es gibt hier einen Sub-Thread zur GUI-Programmierung mit Swing, SWT und JavaFX: http://www.java-forum.org/forum/awt-swing-javafx-swt.13/
Da kannst du gerne Fragen stellen.
 

Neue Themen


Zurück
Oben