Events 从主控制器JavaFX处理辅助弹出控制器事件

Events 从主控制器JavaFX处理辅助弹出控制器事件,events,javafx,controller,popup,fxml,Events,Javafx,Controller,Popup,Fxml,我有一个主控制器处理main.fxml,还有一个控制器处理popup.fxml 从主控制器按下按钮时,弹出窗口出现。在弹出窗口中添加玩家。玩家通过textfield添加到数组中,并且必须发送回主控制器。我在弹出控制器中有一个名为“Btnaply”的按钮,当按下该按钮时,我想关闭弹出窗口并从主控制器类处理数组。我只想让我的主控制器类知道弹出窗口 这就是我从主控制器创建弹出窗口的方式: button.setOnAction(e -> newWindow()); public voi

我有一个主控制器处理main.fxml,还有一个控制器处理popup.fxml

从主控制器按下按钮时,弹出窗口出现。在弹出窗口中添加玩家。玩家通过textfield添加到数组中,并且必须发送回主控制器。我在弹出控制器中有一个名为“Btnaply”的按钮,当按下该按钮时,我想关闭弹出窗口并从主控制器类处理数组。我只想让我的主控制器类知道弹出窗口

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

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)时,这很容易,因为我只创建了类popup的一个对象,并且有一个
getButton()
getArray()
。在我的主控制器类中,我有一个
Popup-Popup=newpopup()然后我有了一个方法,在这个方法中,我从我的popup类
popup.getButton().setOnAction(e->addPlayers())处理按钮


但是使用fxml是不可能的。我好像拿不到正在运转的物体。如果我要创建一个
弹出窗口
,我只会得到一个新事件,而不是正在运行的事件

与前面方法最相似的方法是将
getButton()
方法添加到控制器类,并从
FXMLLoader
获取控制器类:

Parent popupRoot = fxmlLoader.load();
MyController controller = fxmlLoader.<MyController>getController();
controller.getButton()...
并将其添加到控制器:

private PlayerContainer playerContainer;

public void setPlayerContainer(PlayerContainer playerContainer) {
    this.playerContainer = playerContainer;
}
加载弹出内容后,直接将调用类传递给控制器:

Parent popupRoot = fxmlLoader.load();
MyController controller = fxmlLoader.<MyController>getController();
controller.setPlayerContainer(this);
除了关上窗户。如果您在调用类中适当地处理对列表的更改,那么将
ObservableList
传递给controller类并将所有玩家添加到此列表中也会起作用

看一看。这列出了将对象传递给fxml控制器的一些替代方法。在FXMLLoader方法上设置控制器可能很容易实现,例如,如果使用调用类的内部类作为控制器类。这样,与上面描述的方法相比,重用弹出窗口更难

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