2012-10-05 28 views

回答

37

当时initialize()控件尚未准备好处理焦点。

你可以尝试下招:

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

对于棘手复杂的应用程序(如Pavel_K在评论),你可能要重复这个程序几次和呼叫方法线下一个:

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

注意这是没有文档记录的方法,如果在未来的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()); 
相关问题