2012-10-05 8 views

Antwort

37

Zum Zeitpunkt der initialize() Steuerelemente sind noch nicht bereit, Fokus zu behandeln.

Sie können nächsten Trick versuchen:

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

Für schwierige komplexe Anwendungen (wie Pavel_K in den Kommentaren hat), können Sie diese Routine mehrmals und Call-Methode Linie wiederholen nächsten:

private void repeatFocus(Node node) { 
    Platform.runLater(() -> { 
     if (!node.isFocused()) { 
      node.requestFocus(); 
      repeatFocus(node); 
     } 
    }); 
} 

Beachten Sie, dass dies kein undokumentierter Ansatz ist und es möglicherweise ratsam ist, ein Limit für Wiederholungen hinzuzufügen, um eine Endlosschleife zu vermeiden, wenn sich in zukünftigen Java-Versionen etwas geändert hat oder ein Fehler aufgetreten ist. Lieber den Fokus verlieren als eine ganze App. :)

+0

das funktioniert für mich, Danke! – Adil

+0

Ich hatte ein etwas verwandtes Problem, mein 'TextArea' weigerte sich, den Fokus programmgesteuert zu erhalten, obwohl die Bühne sichtbar und aktiv war ** und ** der aktuell laufende Thread der JavaFX-Anwendungsthread war. Aber wenn ich dem Beispiel gefolgt bin und ein neues 'Runnable' eingereiht habe, hat es funktioniert. Wirklich seltsam, ich habe keine Worte dafür. –

+0

Dies scheint nicht mehr mit JavaFX 8 zu funktionieren. 'Tf == null' ist immer noch wahr, wenn' initialize' ausgeführt wird. – skiwi

7

Wenn Sie anfordernFocus(); Nach der Initialisierung der Szene wird es funktionieren!

So:

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(); 

Ich hoffe, das hilft. :)

5

Die exakt gleiche Antwort wie @Sergey Grinev. Stellen Sie sicher, dass Ihre Version von Java auf dem neuesten Stand ist (JDK 1.8 oder höher).

Platform.runLater(()->myTextField.requestFocus());