【问题标题】:Focus issue when mixing JavaFX and Swing multiple times多次混合 JavaFX 和 Swing 时的焦点问题
【发布时间】:2014-10-28 14:32:42
【问题描述】:

如果我将 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,它拥有焦点,我可以输入文本。

我真的不使用VM参数,因为这不是官方支持的VM功能,因为它合并了Swing和JavaFX两个应用程序线程。你知道,我的例子在不使用标志的情况下是如何工作的吗?

【问题讨论】:

  • 查看@kleopatra 提出的问题/答案
  • 搜索 1 小时后没有找到任何东西 - 你有什么提示吗? @mKorbel
  • 抱歉,我没有找到任何可以解决我问题的方法。你能给我一个关于我的代码示例的明确提示吗? @mKorbel

标签: java swing javafx migration


【解决方案1】:

这似乎是一个错误。我在 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);
}
}

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2018-06-27
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多