我有一个主控制器来处理我的main.fxml,另一个控制器处理我的popup.fxml
从主控制器按下按钮时,会出现弹出窗口。在弹出窗口中添加玩家。播放器按文本字段添加到阵列中,必须发送回主控制器。我的弹出控制器中有一个名为“btnApply”的按钮,当按下该按钮时,我想关闭弹出窗口并从我的主控制器类处理该数组。我只希望我的主控制器类知道弹出窗口。
这是我从主控制器创建弹出窗口的方式:
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)的情况下创建弹出窗口时,这很简单,因为我只创建了类弹出窗口的对象并且有getButton()
和getArray()
。在我的主控制器类中,我有一个Popup popup = new Popup();
然后我有一个方法可以处理弹出类popup.getButton().setOnAction(e -> addPlayers());
中的按钮
但是使用fxml是不可能的。我似乎无法得到正在运行的对象。如果我要创建Popup popup
,我将获得一个新事件,而不是正在运行的事件。
答案 0 :(得分:0)
与您之前的方法最相似的方法是将getButton()
方法添加到控制器类并从FXMLLoader
获取控制器类:
Parent popupRoot = fxmlLoader.load();
MyController controller = fxmlLoader.<MyController>getController();
controller.getButton()...
但是我建议采用不同的方法来传递数据,因为这样你就可以将自己限制在弹出窗口中的一个按钮作为提交玩家的唯一方法。我宁愿通过“通知”创建弹出窗口的类来做到这一点,即:
在调用类
中实现此接口public interface PlayerContainer {
void addPlayers(Player[] players);
}
并将其添加到控制器:
private PlayerContainer playerContainer;
public void setPlayerContainer(PlayerContainer playerContainer) {
this.playerContainer = playerContainer;
}
在加载弹出内容后直接将调用类传递给控制器:
Parent popupRoot = fxmlLoader.load();
MyController controller = fxmlLoader.<MyController>getController();
controller.setPlayerContainer(this);
当用户提交播放器数据时,只需调用
即可this.playerContainer.addPlayers(playerData);
除了关闭窗口。如果您在调用类中适当地处理对列表的更改,那么将ObservableList<Player>
传递给控制器类并将所有玩家添加到此列表也会有效。
看看jewelsea's answer to "Passing Parameters JavaFX FXML"。这列出了一些可以将对象传递给fxml控制器的替代方法。 在FXMLLoader上设置控制器方法可以很容易实现,例如如果您使用调用类的内部类作为控制器类。这样,重复使用弹出窗口比使用上述方法更难......