混合JavaFX和Swing多次时的焦点问题

时间:2014-10-28 14:32:42

标签: java swing javafx migration

如果我将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的两个应用程序线程。你知道吗,我的例子如何在不使用旗帜的情况下工作?

1 个答案:

答案 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);
}
}