【发布时间】:2016-06-12 16:47:02
【问题描述】:
我开始探索 JavaFX FXML 应用技术。
我使用在 Main 类中访问的一个主 Stage,带有 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 是用户名登录/注册的字段。
@FXML private Button buttonLoginRegister;
@FXML private Button buttonRegisterBack;
@FXML private TextField fieldLoginUsername;
@FXML private TextField fieldRegisterUsername;
@FXML
private void handleButtonAction(ActionEvent event) throws IOException {
Stage stage = Main.getStage();
if (event.getSource() == buttonLoginRegister) {
stage.setScene(Main.REGISTER);
stage.show();
// Setting the text, the working way
TextField node = (TextField) stage.getScene().lookup("#fieldRegisterUsername");
node.setText(fieldLoginUsername.getText());
// Setting the text, the erroneous way
// fieldRegisterUsername.setText(fieldLoginUsername.getText());
} else {
stage.setScene(Main.LOGIN);
stage.show();
}
}
我的目标是将LOGIN TextField 中的值复制到REGISTER 场景中的值。使用上面的代码效果很好。但是首先我尝试通过以下方式访问另一个场景中的元素:
fieldRegisterUsername.setText(fieldLoginUsername.getText());
这是错误的。确切地说,fieldRegisterUsername 是null。
为什么使用lookup(String id) 方法找到了一些元素,而不是使用@FXML 注释?
【问题讨论】:
-
通常不鼓励为不同的 FXML(视图)共享控制器。如果您只是从 JavaFX 开始,我会特别建议您不要这样做。看看this question。
-
这是有争议的,很多开发人员都使用这种方式,并且相同的数字是agianst。在 2 个小场景的情况下,我个人认为共享控制器没什么不好。我之前已经阅读过链接的问题,但是它与我的持久性需求相冲突。
-
不确定我理解“需要持久性”是什么意思。请参阅我的答案以解释为什么
lookup在您的情况下有效。请记住,除非您为FXMLLoader设置了控制器,否则对load的每次调用都会创建控制器类的新实例。 -
@James_D 我认为你是对的,JavaFX' Greg Brown:“FXML 文档与其控制器之间的 1:1 关联是设计使然。”上下文,以回复 Adam Bien(afterburner.fx 家伙),他想要多个控制器用于 1 个 fxml 文件。尽管如此,它清楚地表明它是 1:1 的设计。因此,做其他任何事情都会导致问题和丑陋,这不足为奇。 (尽管在控制器中实现 Initializable 是可选的)。顺便说一句,感谢您对 JavaFX 相关问题的回答!