我尝试使用SwingNode在JavaFX中使用Swing组件:
public class MyTest extends Application {
@Override
public void start(Stage stage) {
final SwingNode swingNode = new SwingNode();
FlowPane pane = new FlowPane();
Button btn = new Button("1");
btn.setVisible(false);
pane.getChildren().add(btn);
createAndSetSwingContent(swingNode);
pane.getChildren().add(swingNode);
stage.setScene(new Scene(pane, 100, 50));
stage.show();
btn.setVisible(true);
}
private void createAndSetSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
swingNode.setContent(new JButton("Click me!"));
}
});
}
public static void main(String[] args) {
launch(args);
}
}
启动应用程序后,窗口的某些部分(背景和JavaFX按钮)是黑色的:
调整大小(或其他更新)后,窗口显示正确:
为什么会这样,我该如何解决?
答案 0 :(得分:0)
答案 1 :(得分:0)
objSwingNode.requestFocus(); objSwingNode.autosize();
答案 2 :(得分:0)
我已经找到了一个“糟糕的”解决方案,但是对我有用,在显示了舞台之后,以延迟的方式重新绘制了Swing组件:
new Timer().schedule(new TimerTask() {
public void run() {
swingNode.getContent().repaint();
}
}, 500L);
因此,您的代码将如下所示:
public class MyTest extends Application {
@Override
public void start(Stage stage) {
final SwingNode swingNode = new SwingNode();
FlowPane pane = new FlowPane();
Button btn = new Button("1");
btn.setVisible(false);
pane.getChildren().add(btn);
createAndSetSwingContent(swingNode);
pane.getChildren().add(swingNode);
stage.setScene(new Scene(pane, 100, 50));
stage.show();
btn.setVisible(true);
// delays Swing component repaint 1/2 sec.
new Timer().schedule(new TimerTask() {
public void run() {
swingNode.getContent().repaint();
}
}, 500L);
}
private void createAndSetSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
swingNode.setContent(new JButton("Click me!"));
}
});
}
public static void main(String[] args) {
launch(args);
}
}
有点晚了,但希望对您有所帮助!