在Swing中嵌入JavaFX

时间:2018-08-16 05:23:15

标签: java swing javafx

这是我在这里的第一个问题,所以我有点紧张,但让我们直接说清楚。我试图将JavaFX场景嵌入到JFrame中,但似乎不太成功。场景有时可以正确渲染,但其他时候只是灰色背景。在过去的几天里,我一直在想一个解决方案,但是似乎找不到。这是代码:

public class Popup {
public Popup() {
    SwingUtilities.invokeLater(() -> {
        JFrame frame = new JFrame("popup");
        frame.setUndecorated(true);
        frame.setType(Window.Type.POPUP);
        JFXPanel panel = new JFXPanel();
        frame.add(panel);
        Platform.runLater(() -> {
            VBox root = new VBox();
            root.setStyle("-fx-background: red;");
            Scene scene = new Scene(root);
            Label label = new Label("hello friend");
            Label other = new Label("hello WORLD!!!");
            root.getChildren().addAll(label, other);
            panel.setScene(scene);
            /*synchronized (this) {
                try {
                    wait(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }*/

            SwingUtilities.invokeLater(() -> {
                frame.pack();
                frame.setVisible(true);
            });
        });
    });
}

我不确定为什么,但是在取消注释我注释掉的代码段时,似乎更可能使场景正确渲染。 我为我的英语不好而道歉,这不是我的母语。

1 个答案:

答案 0 :(得分:0)

以下是在Swing JFrame中具有JavaFX组件的示例:

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javax.swing.*;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import java.awt.Point;
public class FxInSwing {
    private JFrame frame;
    public static void main(String... args) {
        SwingUtilities.invokeLater(() -> {
            new FxInSwing().initAndShowGUI();
        });
    }
    /*
     * Builds and displays the JFrame with the JFXPanel.
     * This method is invoked on the Swing Event Dispatch Thread -
     * see the main().
     */
    private void initAndShowGUI() {
        frame = new JFrame("JavaFX in Swing App");
        JFXPanel fxPanel = new JFXPanel();
        frame.add(fxPanel);
        frame.setSize(400, 200);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLocation(new Point(150, 150));
        Platform.runLater(() -> {
            fxPanel.setScene(createScene());
        });
    }
    private Scene createScene() {
        VBox root = new VBox();
        root.setStyle("-fx-background: red;");
        Label label = new Label("hello friend");
        Label other = new Label("hello WORLD!!!");
        root.getChildren().addAll(label, other);
        return new Scene(root);
    }
}