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