2014-10-28 59 views
0

如果我将Swing嵌入到嵌入到Swing中的嵌入式JavaFX中,我确实遇到了控件焦点方面的问题。多次混合JavaFX和Swing时的焦点问题

摇摆 - 的JavaFX - 秋千

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上注册FocusListener,我发现它在点击后成为焦点,但它瞬间失去焦点。

但是,如果使用:

-Djavafx.embed.singleThread=true

的例子开始工作。我现在可以点击TextArea,它拥有焦点,我可以输入文本。

我真的不使用VM参数,因为它不是官方支持的虚拟机功能,因为它合并了Swing和JavaFX的两个应用程序线程。你知道,我的例子如何运作而不使用标志?

+0

检查问题(S)/答案(S)约由@kleopatra – mKorbel 2014-10-28 14:58:55

+0

搜索1小时后没有发现任何东西 - 你有暗示吗? @mKorbel – sialcasa 2014-10-28 18:00:20

+0

[例.___](http://stackoverflow.com/users/203657/kleopatra?tab=questions) – mKorbel 2014-10-29 00:12:50

回答

0

这似乎是一个错误。我提起它基奈吉拉,并得到了repsonse,这将是固定在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); 
} 
}