如果我将Swing嵌入嵌入到Swing中的嵌入式JavaFX中,我确实存在控制焦点的问题。
Swing - JavaFX - Swing
public EmbeddedTestWithFX() {
setSize(new Dimension(300, 300));
JTextArea textArea = new JTextArea();
textArea.setSize(new Dimension(150, 150));
JPanel container = new JPanel();
container.setLayout(null);
container.add(textArea);
JFXPanel jfxPanel = new JFXPanel();
Platform.runLater(() -> {
SwingNode swing = new SwingNode();
StackPane stack = new StackPane(swing);
Scene scene = new Scene(stack);
swing.setContent(container);
SwingUtilities.invokeLater(() -> jfxPanel.setScene(scene));
});
setContentPane(jfxPanel);
}
public static void main(String[] args) {
new EmbeddedTestWithFX().setVisible(true);
}
}
现在我可以看到TextArea,但问题是,它没有得到关注。 如果我在TextArea上注册一个FocusListener,我看到它在点击后成为焦点,但它立即失去了焦点。
但如果我使用:
-Djavafx.embed.singleThread=true
示例开始起作用。我现在可以点击TextArea,它拥有focos,我可以输入文字。
我真的不使用VM参数,因为它不是官方支持的VM功能,因为它合并了Swing和JavaFX的两个应用程序线程。你知道吗,我的例子如何在不使用旗帜的情况下工作?
答案 0 :(得分:0)
这似乎是一个错误。我在Kenai Jira上提交了它并得到了回复,它将在u40修复 - RT-39196
作为一种解决方法,您可以这样做:
public EmbeddedTestWithFX() {
setSize(new Dimension(300, 300));
JTextArea textArea = new JTextArea();
textArea.setSize(new Dimension(150, 150));
JPanel container = new JPanel();
container.setLayout(null);
container.add(textArea);
JFXPanel jfxPanel = new JFXPanel();
//WORKAROUND
jfxPanel.setFocusable(false);
Platform.runLater(() -> {
SwingNode swing = new SwingNode();
StackPane stack = new StackPane(swing);
Scene scene = new Scene(stack);
swing.setContent(container);
SwingUtilities.invokeLater(() -> jfxPanel.setScene(scene));
});
setContentPane(jfxPanel);
}
public static void main(String[] args) {
new EmbeddedTestWithFX().setVisible(true);
}
}