java - javax中控制器之间通信背后的逻辑
问题描述
我是新手,正在学习 java 和 javafx。
是否有任何可以建议的来源,或者您能否简要解释一下 javafx 中控制器通信背后的逻辑。
我制作了一个程序,它有两个控制器和相应的 fxml 文件。
主控制器.java
public class MainController implements Initializable {
@FXML
private Label mainL;
@FXML
private Button mainB;
@FXML
private void handleButtonAction(ActionEvent event) throws IOException {
FXMLLoader popupLoader = new FXMLLoader(getClass().getResource("Popup.fxml"));
Parent root = (Parent)popupLoader.load();
PopupController popupCont = popupLoader.getController();
popupCont.changeLabel("The Second");
Stage stage = new Stage();
stage.setTitle("Popup Window");
stage.setScene(new Scene(root));
stage.show();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
弹出控制器.java
public class PopupController implements Initializable {
@FXML
private Label secondaryL;
@FXML
private Button secondB;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
public void changeLabel(String s){
secondaryL.setText(s);
}
@FXML
private void handleButtonAction(ActionEvent event) throws IOException {
Stage stage = (Stage) secondB.getScene().getWindow();
stage.close();
}
}
在主窗口中,我有mainL标签和mainB按钮。单击 mainB 按钮时,弹出窗口会打开一个secondaryL标签和按钮(secondB)。它还将secondaryL 文本从“Secondary Label”更改为“the Second”。当 secondB 按钮单击此处时,它会关闭窗口并为您留下主窗口。当 secondB 单击时,我在这里需要的是它不仅应该关闭窗口,而且还应该更改 mainL 标签的文本。
我不知何故无法弄清楚这里的逻辑。我可以理解,当我打开新窗口时,我可以在此处发送一些参数或在此处运行方法。但是一旦我进入新窗口(主窗口仍然在后面),我就无法再访问主控制器了。我知道我可以创建一个主控制器的新实例并对其进行处理,但这不是我想要的。我希望更改相同的主窗口组件。就像来自辅助控制器的 mainL。
谁能解释我应该在这里使用什么逻辑。
谢谢。
解决方案
您只需要将对第一个控制器的引用传递给您的第二个控制器。有几个步骤可以完成这项工作。
弹出控制器.java
首先,将实例引用添加MainController
到您的PopupController.java
类中:
private MainController mainController;
添加二传手:
public void setMainController(MainController mainController) {
this.mainController = mainController;
}
主控制器.java
现在您需要使用新的设置器将您MainController
的传递给:PopupController
私有无效句柄按钮操作(ActionEvent 事件)抛出 IOException {
FXMLLoader popupLoader = new FXMLLoader(getClass().getResource("Popup.fxml"));
Parent root = (Parent) popupLoader.load();
PopupController popupCont = popupLoader.getController();
popupCont.setMainController(this); // This passes this controller reference to your popup
popupCont.changeLabel("The Second");
Stage stage = new Stage();
stage.setTitle("Popup Window");
stage.setScene(new Scene(root));
stage.show();
}
您现在有了正确的参考。所以现在在关闭您的 时PopupController
,只需使用对 的引用调用该setMainL()
方法MainController
:
mainController.setMainL("the First!");
Stage stage = (Stage) secondB.getScene().getWindow();
stage.close();
发生了什么?
这是 JavaFX 中相当常见的用法。如果没有首先获得对该类的引用,则无法从另一个类访问该类;这只是提供该参考供您使用。
推荐阅读
- r - RDA 可视化 - 根据 RDA1 绘制物种丰度图
- sql - SQL查询根据不同列的先前值计算行数
- reactjs - 为什么图像没有通过反应上传到服务器?
- r - 在 RStudio Connect 上部署 Shiny 应用程序时 curl 服务器证书验证失败
- printing - ZEBRA 打印机有时会打印空白页
- java - 如何使用 testng 参数化 selenium 中的用户数据并提供给脚本
- javascript - 在 MS Edge 中操作负动画延迟值
- asp.net-mvc - Aspnet Core MVC 验证消息始终可见
- php - 使用非常小而简单的脚本继续达到 memory_limit
- php - PHP Soap客户端请求时间测量