Swing应用程序玻璃窗格中的JavaFX组件未显示

Swing应用程序玻璃窗格中的JavaFX组件未显示,java,swing,javafx,Java,Swing,Javafx,我有一个用Swing编写的简单应用程序,它还允许您通过一个按钮启用/禁用其他JavaFX功能。现在我只想展示这些功能 我为JavaFX组件使用了一个玻璃窗格,并使用了以下actionPerformed方法,该方法为每次单击按钮(出于测试目的)在新层中生成一个组件 分层窗格定义为: layers = new JLayeredPane(); ... frame.setGlassPane(layers); 在my FXVersion.java中,我试图使用以下代码设置场景并显示任何内容: p

我有一个用Swing编写的简单应用程序,它还允许您通过一个按钮启用/禁用其他JavaFX功能。现在我只想展示这些功能

我为JavaFX组件使用了一个玻璃窗格,并使用了以下actionPerformed方法,该方法为每次单击按钮(出于测试目的)在新层中生成一个组件

分层窗格定义为:

layers = new JLayeredPane();
...
frame.setGlassPane(layers);    
在my FXVersion.java中,我试图使用以下代码设置场景并显示任何内容:

public class FXVersion {

    JFXPanel panel;

    public FXVersion() {
    }

    public void start(int i) {
        panel = new JFXPanel();
        Point origin = new Point(250 + i * 10, 100 + i * 10);
        Rectangle r = new Rectangle(origin.x, origin.y, 140, 140);
        r.setFill(Color.CADETBLUE);

        Group root = new Group();
        Scene scene = new Scene(root, 800, 300);
        scene.setFill(Color.BLACK);
        root.getChildren().add(r);
        panel.setScene(scene);
    }
}
什么也没发生。我没有收到任何错误甚至警告,只是没有面板出现

我知道这是一个场景问题,而不是其他任何问题,因为如果我用just Swing替换JavaFX东西,它工作得很好,例如

public class FXVersion {
    JLabel panel;

    public FXVersion() {
    }  

    public void start(int i) {
        panel = new JLabel();
        Point origin = new Point(250 + i * 10, 100 + i * 10);
        panel = new JLabel("BOOM " + i);
        panel.setVerticalAlignment(JLabel.TOP);
        panel.setHorizontalAlignment(JLabel.CENTER);
        panel.setOpaque(true);
        panel.setBounds(origin.x, origin.y, 140, 140);
    }
}
这将显示一系列标签,每个标签与前一个重叠,每次单击“激活”按钮时显示一个标签

编辑: 我还尝试使用SwingUtilities和Platform.runLater(将其放在应用程序线程上),但这也没有帮助


我相信问题在于玻璃面板的设置,因为代码按预期工作,当我只是在面板底部添加包含所有Swing内容的JFXpanel作为另一个组件时。但是,这并没有达到预期的叠加效果。

如果可以避免的话,最好不要将Swing和JavaFX混合使用。使用一个或另一个。看起来您正在AWT事件调度线程上创建
场景。根据“场景对象必须在JavaFX应用程序线程上构造和修改。”说明了如何正确管理不同的线程。如果可以避免,最好不要将Swing和JavaFX混合使用。使用一个或另一个。看起来您正在AWT事件调度线程上创建
场景。根据“场景对象必须在JavaFX应用程序线程上构造和修改。”向您展示了如何正确管理不同的线程。
public class FXVersion {
    JLabel panel;

    public FXVersion() {
    }  

    public void start(int i) {
        panel = new JLabel();
        Point origin = new Point(250 + i * 10, 100 + i * 10);
        panel = new JLabel("BOOM " + i);
        panel.setVerticalAlignment(JLabel.TOP);
        panel.setHorizontalAlignment(JLabel.CENTER);
        panel.setOpaque(true);
        panel.setBounds(origin.x, origin.y, 140, 140);
    }
}