javax中控制器之间通信的逻辑

时间:2018-06-18 17:24:31

标签: java javafx scenebuilder

我是新手,学习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();


    }
}

在主窗口中,我有 mainL 标签和 mainB 按钮。 单击mainB按钮时,将打开弹出窗口,其中包含 secondaryL 标签和按钮( secondB )。它还会更改" Secondary Label"中的secondaryL文本。到第二个"。 当点击这里的第二个B按钮时,它会关闭窗口并离开主窗口。 当secondB点击它时,我需要的是它不仅应该关闭窗口,还应该更改mainL标签的文本。

我在某种程度上无法弄清楚这里的逻辑。 我可以理解当我打开新窗口时我可以发送一些参数或在这里运行方法。但是一旦我进入新窗口(主窗口仍然在后面),我再也无法访问主控制器了。 我知道我可以创建一个新的主控制器实例并对其进行处理但是,这不是我想要的。我想要改变相同的主窗口组件。就像来自辅助控制器的mainL一样。

任何人都可以解释我在这里使用的逻辑。

感谢。

1 个答案:

答案 0 :(得分:1)

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

  

PopupController.java

首先,将Dim c As Range For Each c In ActiveSheet.Range("myNameRange").Columns(3).Cells If c.MergeArea.Count < 2 Then c.Value = "" 'need help merging column 3 n 4 Range(c, c.offset(0,1)).Merge End If Next 的实例引用添加到MainController类:

PopupController.java

添加二传手:

private MainController mainController;
  

MainController.java

现在您需要使用新的setter将public void setMainController(MainController mainController) { this.mainController = mainController; } 传递给MainController

private void handleButtonAction(ActionEvent event)抛出IOException {

PopupController

}

您现在有适当的参考。现在关闭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

发生了什么?

这是JavaFX中相当常见的用法。如果没有首先获得该类的引用,则无法从另一个类访问该类;这只是提供了您使用的参考。