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;这只是提供了供您使用的参考。