首页 > 解决方案 > 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。

谁能解释我应该在这里使用什么逻辑。

谢谢。

标签: javajavafxscenebuilder

解决方案


您只需要将对第一个控制器的引用传递给您的第二个控制器。有几个步骤可以完成这项工作。

弹出控制器.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 中相当常见的用法。如果没有首先获得对该类的引用,则无法从另一个类访问该类;这只是提供该参考供您使用。


推荐阅读