使用ActionEvent

时间:2018-02-05 16:19:25

标签: javafx scene stage

你好我有一个几乎没有控制器的JavaFX应用程序,我有2个选项可以回到上一个屏幕。用户可以单击“离开”按钮,或者在此屏幕上完成某些任务后将自动移至上一个。我有问题,因为我已经创建了方法wiut fxml注释,它将ActionEvent对象作为参数,并在用户单击按钮时调用,当用户完成任务并应自动移动到上一个屏幕时,我无法调用此方法,因为我没有这个对象,它是在动作时创建的 - 在这种情况下单击。如何使两个'退出'选项成为可能?

所以这是我的方法,我的按钮使用'onAction':

@FXML
    private void leaveRoomAction(ActionEvent event) {
        try {
            removePlayerFromRoom();

            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("LobbyView.fxml"));
            Parent root = (Parent) loader.load();

            LobbyController lobbyController = (LobbyController)loader.getController();
            lobbyController.setClientThread(client);
            lobbyController.setNameAndBalance(client.getPlayer().getName());

            Scene scene = new Scene(root);
            Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
            stage.setScene(scene);
            stage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

后来在程序的其他部分:

if(isFinished()){
//here I want write leaving this screen and getting back to previous
}

1 个答案:

答案 0 :(得分:2)

首先,找到另一种方法来获取对Stage的引用。由于您几乎肯定会在控制器中引用场景中的某个节点,因此可以替换

Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();

Stage stage = (Stage) anyNode.getScene().getWindow();

其中anyNode只是你注入控制器的东西。

现在你根本不需要参数,所以你可以删除它。即你最终得到了

@FXML
private Node anyNode ; // probably a more specific type than Node.

@FXML
private void leaveRoomAction() {
    try {
        removePlayerFromRoom();

        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("LobbyView.fxml"));
        Parent root = (Parent) loader.load();

        LobbyController lobbyController = (LobbyController)loader.getController();
        lobbyController.setClientThread(client);
        lobbyController.setNameAndBalance(client.getPlayer().getName());

        Scene scene = new Scene(root);
        Stage stage = anyNode.getScene().getWindow();
        stage.setScene(scene);
        stage.show();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

现在你可以调用方法:

if ( isFinished() ) {
    leaveRoomAction()
}