2012-10-05 15 views
11

私はJavaFX 2.1を使用し、FXMLを使用してGUIを作成しました。このGUIのコントローラにはmyTextField.requestFocus();を追加しました。TextFieldのRequestFocusが機能しません

しかし、私はいつも他のコントロールに焦点を当てています。

答えて

37

initialize()の時点で、制御装置はまだ焦点を処理する準備ができていない。

あなたは、次のトリック試すことができます。

private void repeatFocus(Node node) { 
    Platform.runLater(() -> { 
     if (!node.isFocused()) { 
      node.requestFocus(); 
      repeatFocus(node); 
     } 
    }); 
} 
:あなたはこのルーチンを数回繰り返して、1次のメソッドラインを呼び出したいことが難しい複雑なアプリケーション(Pavel_Kコメントに持っているよう)について

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
      tf.requestFocus(); 
     } 
    }); 
} 

これは文書化されていないアプローチであり、将来のJavaリリースで何かが変更されたか壊れた場合、無限ループを回避するために繰り返しの制限を追加することをお勧めします。アプリ全体よりもフォーカスを失う。 :)

+0

これは私のために働く、ありがとう! – Adil

+0

私は多少関連した問題を抱えていました。私の 'TextArea'は、ステージが可視でアクティブであってもフォーカスをプログラム的に得ることを拒否しました**と**現在実行中のスレッドはJavaFXアプリケーションスレッドでした。しかし、私がこの例に従って、新しい 'Runnable'を待ち行列に入れると、うまくいきました。本当に奇妙なことに、私はそれについて言葉を持っていません。 –

+0

これはもはやJavaFX 8では動作しないようです。 'tf == null'は、' initialize'が実行された時点でまだ真です。 – skiwi

7

もしあなたがrequestFocus();シーンを初期化した後、動作します!このよう

Stage stage = new Stage(); 
GridPane grid = new GridPane(); 
//... add buttons&stuff to pane 

Scene scene = new Scene(grid, 800, 600); 

TEXTFIELD.requestFocus(); 

stage.setScene(scene); 
stage.show(); 

私はこのことができます願っています。 :)

5

@ Sergey Grinevとまったく同じ答えです。ご使用のJavaのバージョンが最新(JDK 1.8以降)であることを確認してください。

Platform.runLater(()->myTextField.requestFocus()); 
関連する問題