web-dev-qa-db-ja.com

JavaFX:プログラムによるテキストフィールドのフォーカス

キーボードの矢印でのみ使用できるJavaFXでアプリケーションを作成しました。そこで、SceneのステージでMouseEventを禁止し、KeyEventsを「リッスン」しました。また、すべてのノードのフォーカス機能をオフにしました。

for(Node n : children) {
     n.setFocusTraversable(false);

これで、いくつかのテキストフィールド、チェックボックス、ボタンができました。入力コントロール(テキストフィールド、チェックボックスなど)の状態をプログラムで変更したいと思います。たとえば、テキストフィールドを入力してコンテンツをプログラムで編集したいと思います。だから私の質問は次のとおりです。非フォーカストラバース可能なテキストフィールドに入力する方法ですか? textfield.requestFocus();私はテキストフィールドのfocustraversableプロパティにfalseを設定したため、もう機能しません。

ありがとう

12
PacDroid

沿って

_n.setFocusTraversable(false);
_

ノードは、フォーカス不可ではなく、フォーカストラバーサル不可になります。マウスやプログラムを使用して、たとえば焦点を合わせることができます。マウスイベントを防止したので、ここで他のオプション:

_Platform.runLater(new Runnable() {
    @Override
    public void run() {
        textfield.requestFocus();
    }
});

Scene scene = new Scene(root);
_

編集:コメントごと
requestFocusのjavadocの状態:

...フォーカスを受け取る資格を得るには、ノードがシーンの一部であり、そのノードとそのすべての祖先が表示されている必要があり、無効にしないでください。 ...

したがって、このメソッドは、次のようにシーングラフの構築後に呼び出す必要があります。

_Scene scene = new Scene(root);
textfield.requestFocus();
_

ただし、上記のPlatform.runLaterは、最後にメインメソッドstart()の後に実行されます。これにより、requestFocusの呼び出しがシーングラフの結合の後になります。

RequestFocus実装コードに応じて、他の理由が考えられます。

47
Uluk Biy

.requestFocus();を設定しますコントローラをロードする.fxmlファイルで起動するinitializeメソッド

@Override
public void initialize(URL url, ResourceBundle rb) {
/* the field defined on .fxml document  
@FXML
private TextField txtYear;
*/
txtYear.requestFocus();
}
1
Ravinath