我开始研究JavaFX FXML应用程序技术。JavaFX FXML访问成功使用lookup()方法,但不使用@FXML注释
我使用主类中访问的一个主舞台Main.getStage()
,它在应用程序开始时使用重写方法public void start(Stage stage)
调用。在内部有两个public static Scene
以在切换它们时保持持久性。
@Override
public void start(Stage stage) throws Exception {
STAGE = stage;
LOGIN = new Scene(FXMLLoader.load(getClass().getResource("Login.fxml")));
REGISTER = new Scene(FXMLLoader.load(getClass().getResource("Register.fxml")));
STAGE.setScene(LOGIN);
STAGE.setTitle("FXApplication");
STAGE.show();
}
public static Stage getStage() {
return STAGE;
}
这两个场景都有相同的控制器类,称为MainController
。使用:
- 按键采用
fx:id="buttonLoginRegister"
去REGISTER
场景 - 按键采用
fx:id="buttonRegisterBack"
回去给LOGIN
之一。
并且两者具有相同的onClick
事件handleButtonAction(ActionEvent event)
。 TextFields是用于登录/注册用户名的字段。
我的目标是将值从LOGIN
文本字段复制到一个在REGISTER
现场。它使用上面的代码很好用。然而,首先我尝试访问另一个场景中的元素:
fieldRegisterUsername.setText(fieldLoginUsername.getText());
这是错误的。确切地说,fieldRegisterUsername
是null
。
为什么在lookup(String id)
方法中发现某些元素而不是@FXML
注释?
通常不鼓励用于不同FXML(视图)的共享控制器。如果你只是从JavaFX开始,我特别建议不要这样做。看看[这个问题](http://stackoverflow.com/questions/17914254/javafx-multiple-fxml-and-1-shared-controller)。 – Itai
这是有争议的,很多开发人员使用这种方式,并且相同的数字是最简单的。就我个人而言,在2个小场景中我看不出共享控制器的坏处。我之前已经阅读过这个链接的问题,但是这与我的持久性需求相冲突。 –
不知道我明白你的意思是“需要坚持”。查看我的答案,解释为什么'lookup'在你的情况下起作用。请记住,除非你为'FXMLLoader'设置了控制器,否则每次调用'load'都会创建一个控制器类的新实例。 – Itai