我有一个用Swing编写的简单应用程序,它还允许您使用按钮启用/禁用其他JavaFX功能。现在我只想显示这些功能。
我正在为JavaFX组件使用一个玻璃窗格,并且具有以下actionPerformed方法,该方法在每次单击按钮时为新图层生成一个组件(用于测试目的)。
@Override
public void actionPerformed(ActionEvent e) {
if (fx) {
// display FX components
newTest = new FXVersion();
newTest.start(i);
layers.add(newTest.panel, new Integer(i));
i++;
layers.setVisible(true);
} else {
// Hide FX stuff
layers.setVisible(false);
}
fx= !fx;
}
分层窗格定义为:
layers = new JLayeredPane();
...
frame.setGlassPane(layers);
在我的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);
}
}
没有任何反应。我没有错误甚至警告,只是没有面板出现。
我知道这是场景的问题而不是其他任何问题,因为如果我用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(将它放在Application线程上),但这也无济于事。
我认为问题在于设置玻璃窗格,因为代码按预期工作,当我只是在包含所有Swing内容的面板底部添加JFXpanel时,作为另一个组件。但是,这没有达到预期的覆盖效果。