javax中控制器之间通信背后的逻辑
Logic behind communication between controllers in javax
我是新手,正在学习 java 和 javafx。
是否有任何来源可以建议,或者您能否简要解释一下 javafx 中控制器通信背后的逻辑。
我做了一个程序,有两个控制器和相应的 fxml 文件。
MainController.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) {
}
}
PopupController.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();
}
}
在 Main window 中,我有 mainL 标签和 mainB 按钮。
当单击 mainB 按钮时,弹出窗口 window 打开带有 secondaryL 标签和按钮 (secondB)。它还将 secondaryL 文本从 "Secondary Label" 更改为 "the Second"。
当点击此处的 secondB 按钮时,它会关闭 window 并留下 Main window。
当 secondB 单击时,我在这里需要的不仅是关闭 window,而且还应该更改 mainL 标签的文本。
不知何故,我无法弄清楚这里的逻辑。
我可以理解当我打开新的 window 我可以在这里发送一些参数或在这里发送 运行 方法。但是一旦我进入新的window(主window还在后面)我就不能再访问主控制器了。
我知道我可以创建一个新的主控制器实例并对其进行处理,但这不是我想要的。我想要更改相同的主要 window 组件。就像辅助控制器的 mainL。
谁能解释一下我在这里应该使用什么逻辑。
谢谢。
您只需将对第一个控制器的引用传递给第二个控制器。有几个步骤可以完成这项工作。
PopupController.java
首先,将对 MainController
的实例引用添加到 PopupController.java
class:
private MainController mainController;
添加一个setter:
public void setMainController(MainController mainController) {
this.mainController = mainController;
}
MainController.java
现在您需要使用新的 setter:
将您的 MainController
传递给 PopupController
private void handleButtonAction(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
时,只需使用对 MainController
:
的引用调用 setMainL()
方法
mainController.setMainL("the First!");
Stage stage = (Stage) secondB.getScene().getWindow();
stage.close();
发生了什么事?
这是 JavaFX 中相当常见的用法。如果不首先获得 对 的引用 class,则无法从另一个访问一个 class;这只是提供了供您使用的参考。
我是新手,正在学习 java 和 javafx。
是否有任何来源可以建议,或者您能否简要解释一下 javafx 中控制器通信背后的逻辑。
我做了一个程序,有两个控制器和相应的 fxml 文件。
MainController.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) {
}
}
PopupController.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();
}
}
在 Main window 中,我有 mainL 标签和 mainB 按钮。 当单击 mainB 按钮时,弹出窗口 window 打开带有 secondaryL 标签和按钮 (secondB)。它还将 secondaryL 文本从 "Secondary Label" 更改为 "the Second"。 当点击此处的 secondB 按钮时,它会关闭 window 并留下 Main window。 当 secondB 单击时,我在这里需要的不仅是关闭 window,而且还应该更改 mainL 标签的文本。
不知何故,我无法弄清楚这里的逻辑。 我可以理解当我打开新的 window 我可以在这里发送一些参数或在这里发送 运行 方法。但是一旦我进入新的window(主window还在后面)我就不能再访问主控制器了。 我知道我可以创建一个新的主控制器实例并对其进行处理,但这不是我想要的。我想要更改相同的主要 window 组件。就像辅助控制器的 mainL。
谁能解释一下我在这里应该使用什么逻辑。
谢谢。
您只需将对第一个控制器的引用传递给第二个控制器。有几个步骤可以完成这项工作。
PopupController.java
首先,将对 MainController
的实例引用添加到 PopupController.java
class:
private MainController mainController;
添加一个setter:
public void setMainController(MainController mainController) {
this.mainController = mainController;
}
MainController.java
现在您需要使用新的 setter:
将您的MainController
传递给 PopupController
private void handleButtonAction(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
时,只需使用对 MainController
:
setMainL()
方法
mainController.setMainL("the First!");
Stage stage = (Stage) secondB.getScene().getWindow();
stage.close();
发生了什么事?
这是 JavaFX 中相当常见的用法。如果不首先获得 对 的引用 class,则无法从另一个访问一个 class;这只是提供了供您使用的参考。