我想其中一个可能的解决方案是添加以下方法 TestController.java
public void handleWindowShownEvent() { usernameInput.requestFocus(); }
然后改变 start 方法 TestLauncher 以下内容:
start
@Override public void start(Stage stage) throws Exception { FXMLLoader loader = new FXMLLoader(); Parent root = (Parent)loader.load(TestController.class.getResourceAsStream("TestView.fxml")); final TestController controller = (TestController)loader.getController(); stage.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent window) { controller.handleWindowShownEvent(); } }); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); }
我真的很欢迎其他解决方案,因为这个看起来太笨重......
另一个解决方案当然不是很性感但是将节点与应用程序分离:
root.sceneProperty().addListener(new ChangeListener<Scene>() { @Override public void changed(ObservableValue<? extends Scene> observable, Scene oldValue, Scene newValue) { newValue.windowProperty().addListener(new ChangeListener<Window>() { @Override public void changed(ObservableValue<? extends Window> observable, Window oldValue, Window newValue) { newValue.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent event) { usernameInput.requestFocus(); } }); } }); } });
在我的情况下更有意义。