处理来自主控制器 JavaFX 的辅助弹出控制器事件

Handling secondary popup controller events from main controller JavaFX

我有一个处理我的 main.fxml 的主控制器和一个处理我的 popup.fxml

的第二个控制器

当按下主控制器的按钮时,会出现弹出窗口 windows。在弹出窗口 window 中添加玩家。玩家通过文本字段添加到数组中,并且必须发送回主控制器。我的弹出控制器中有一个名为 "btnApply" 的按钮,当按下该按钮时,我想关闭弹出窗口 window 并从我的主控制器 class 处理数组。我只希望我的主控制器 class 知道弹出窗口。

这就是我从主控制器创建弹出窗口的方式:

button.setOnAction(e -> newWindow());

     public void newWindow(){
     try{
                FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("popup.fxml"));
                Parent popupRoot = fxmlLoader.load();
                Stage playerStage = new Stage();
                playerStage.setTitle("Player");
                playerStage.setScene(new Scene(popupRoot, 720, 600));
                playerStage.show();
            }catch(Exception e) {
                e.printStackTrace();
            }
     }

现在的问题是如何获取事件或对象。当我在不使用 FXML(手动创建 GUI)的情况下创建弹出窗口 window 时,这很容易,因为我只是制作了 Class 弹出窗口的对象并有一个 getButton()getArray().在我的主控制器中 class 我有一个 Popup popup = new Popup(); 然后我有一个方法可以处理弹出窗口中的按钮 class popup.getButton().setOnAction(e -> addPlayers());

但是使用 fxml 是不可能的。我似乎无法获得 运行 的对象。如果我要创建一个 Popup popup,我只会得到一个新事件,而不是正在 运行 的事件。

与您之前的方法最相似的方法是将 getButton() 方法添加到您的控制器 class 并从 [=16= 获取控制器 class ]:

Parent popupRoot = fxmlLoader.load();
MyController controller = fxmlLoader.<MyController>getController();
controller.getButton()...

备选方案

不过,我推荐一种不同的方法来传递数据,因为这样您就只能使用弹出窗口中的单个按钮作为提交玩家的唯一方式。我宁愿通过 "notifying" class 创建弹出窗口来做到这一点,即:

调用时实现该接口class

public interface PlayerContainer {
    void addPlayers(Player[] players);
}

并将其添加到控制器中:

private PlayerContainer playerContainer;

public void setPlayerContainer(PlayerContainer playerContainer) {
    this.playerContainer = playerContainer;
}

并在加载弹出内容后直接将调用class传递给控制器​​:

Parent popupRoot = fxmlLoader.load();
MyController controller = fxmlLoader.<MyController>getController();
controller.setPlayerContainer(this);

当用户提交播放器数据时,只需调用

this.playerContainer.addPlayers(playerData);

除了关闭window。如果您在调用 class.

中适当地处理对列表的更改,则将 ObservableList<Player> 传递给控制器​​ class 并将所有玩家添加到此列表也可以工作

看看jewelsea's answer to "Passing Parameters JavaFX FXML"。这列出了一些可以将对象传递给 fxml 控制器的替代方法。 在 FXMLLoader 上设置控制器的方法很容易实现,例如如果您使用调用 class 的内部 class 作为控制器 class。但是,与上述方法相比,这种方式更难重用弹出窗口...