2016-07-18 13 views
1

次のコードは、JFXPanelJPanelを含むJFrameを生成します。各パネルにはテキストフィールドがあります。JFXPanelがTextFieldにフォーカスを当てる理由

JFXPanel fxPanel = new JFXPanel(); 

JPanel swingPanel = new JPanel(new FlowLayout()); 
swingPanel.add(new JTextField("Swing")); 

JPanel contentPanel = new JPanel(new BorderLayout()); 
contentPanel.add(fxPanel, BorderLayout.PAGE_START); 
contentPanel.add(swingPanel, BorderLayout.CENTER); 

JFrame frame = new JFrame("Main Frame"); 
frame.setContentPane(contentPanel); 

FlowPane root = new FlowPane(); 
root.getChildren().add(new TextField("FX")); 
Scene scene = new Scene(root); 

Platform.runLater(() -> fxPanel.setScene(scene)); 
SwingUtilities.invokeLater(() -> frame.setVisible(true)); 

まず、スイングテキストフィールドにフォーカスを当ててみましょう。次に、JFXPanelの内部をクリックしたとします(ただし、テキストフィールドの境界内にはありません)。 JFXPanelは、TextFieldに焦点を当てています。

どうしてですか?なぜJFXPanelはそれ自体の焦点を維持していないのですか?なぜそれがテキストフィールドにそれを与えるのですか?どのコンポーネントに焦点を当てるかをどのように選択しますか?テキストフィールドに焦点を当てるのを防ぐ正しい方法は何ですか?

答えて

1

JFXPanelSceneであり、より詳しくはfocusOwnerPropertyです。

Sceneを作成すると、このプロパティに格納されているNodeにフォーカスが当てられます。

これが原因TextFieldであるがfocus traversableあるシーングラフでのみNodeである:

は、このノードがフォーカストラバーサルサイクルの一部であるかどうかを指定します。 このプロパティがtrueの場合、フォーカスはこのノードに移動でき、 このノードからは通常のフォーカストラバーサルキーを使用して移動できます。デスクトップ上では、このようなキー は、通常、フォーカスを前方に移動するためのタブであり、後方に移動するためのシフト+タブである。 。 シーンが作成されると、focusTraversable変数がtrueで、 からrequestFocus()への呼び出しによって明示的にフォーカスが設定されていない限り、 がフォーカスを受け取ることができる ノードにフォーカスが移ります。

は解決策として、あなたは

Platform.runLater(() -> { 
    root.setOnMouseClicked(e -> root.requestFocus()); 
}); 

次これはFlowPaneクリックに焦点を当てます追加することができます。

+0

したがって、 'root.setFocusTraversable(true);を呼び出すと、OPが望む動作になりますか? –

+0

@ James_Dは、残念ながらそうではありません。 – DVarga

+0

フォーカスのトラバース可能な説明は間違っていますか、そうでない場合は、このアプローチに間違いがありますか? – UtterlyConfused

関連する問題