65

我需要通过控制器中的代码关闭当前的 fxml 窗口

我知道 stage.close() 或 stage.hide() 在 fx 中这样做

如何在 fxml 中实现这一点?我试过了

private void on_btnClose_clicked(ActionEvent actionEvent) {
        Parent root = FXMLLoader.load(getClass().getResource("currentWindow.fxml"));    
        Scene scene = new Scene(root);

        Stage stage = new Stage();            
        stage.setScene(scene);
        stage.show();
}

但它不起作用!

所有帮助将不胜感激。谢谢!

4

9 回答 9

176
  1. 给你的关闭按钮一个 fx:id,如果你还没有:<Button fx:id="closeButton" onAction="#closeButtonAction">
  2. 在您的控制器类中:

    @FXML private javafx.scene.control.Button closeButton;
    
    @FXML
    private void closeButtonAction(){
        // get a handle to the stage
        Stage stage = (Stage) closeButton.getScene().getWindow();
        // do what you have to do
        stage.close();
    }
    
于 2012-11-28T09:55:25.153 回答
24

如果您有一个扩展的窗口,javafx.application.Application;您可以使用以下方法。(这将关闭整个应用程序,而不仅仅是窗口。我误解了 OP,感谢评论者指出)。

Platform.exit();

例子:

public class MainGUI extends Application {
.........

Button exitButton = new Button("Exit");
exitButton.setOnAction(new ExitButtonListener());
.........

public class ExitButtonListener implements EventHandler<ActionEvent> {

  @Override
  public void handle(ActionEvent arg0) {
    Platform.exit();
  }
}

编辑 Java 8 的美感:

 public class MainGUI extends Application {
    .........

    Button exitButton = new Button("Exit");
    exitButton.setOnAction(actionEvent -> Platform.exit());
 }
于 2013-08-21T16:15:35.033 回答
12

NullPointerException在收到接受的答案后,我以以下方式实现了这一点。

在我的 FXML 中:

<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel">

在我的Controller课堂上:

@FXML public void onMouseClickedCancelBtn(InputEvent e) {
    final Node source = (Node) e.getSource();
    final Stage stage = (Stage) source.getScene().getWindow();
    stage.close();
}
于 2016-02-11T05:18:13.610 回答
2

如果您不想使用 fxml 链接方法过度扩展您的控制器,您可以执行以下操作:

你必须给它一个 fx:id。例如“closeButton”。在您的 FXML 文件中应该如下所示:

<Button fx:id="closeButton" layoutX="876.0" layoutY="74.0" mnemonicParsing="false" textAlignment="CENTER">

然后你可以在你的初始化方法或任何你想要的地方编写按钮:

@FXML
Button closeButton

public initialize(){
    closeButton.setOnAction(new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent e){
            ((Stage) closeButton.getScence().getWindow()).close();
        }
    });
}
于 2021-12-14T10:29:50.207 回答
1

我不确定这是否是最好的方法(或者它是否有效),但你可以尝试:

private void on_btnClose_clicked(ActionEvent actionEvent) {

        Window window = getScene().getWindow();   

        if (window instanceof Stage){
            ((Stage) window).close();
        }
}

(假设你的控制器是一个Node。否则你必须先获取节点(getScene() 是Node的一个方法)

于 2012-11-27T17:56:51.243 回答
1
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    public void handle(WindowEvent we) {                        
        Platform.setImplicitExit(false);
        stage.close();
    }
});

它相当于hide。所以当你下次要打开它时,你只需检查stage对象是否退出。如果退出,您只需show()调用(stage.show())。否则,你必须开始这个阶段。

于 2015-07-09T06:15:05.480 回答
1

最后,我找到了解决方案

 Window window =   ((Node)(event.getSource())).getScene().getWindow(); 
            if (window instanceof Stage){
                ((Stage) window).close();
            }
于 2019-11-25T13:29:48.097 回答
1

隐藏不会关闭窗口,只是置于可见模式。最好的解决方案是:

@FXML
private void exitButtonOnAction(ActionEvent event){
        ((Stage)(((Button)event.getSource()).getScene().getWindow())).close();      
}
于 2020-05-03T13:44:12.130 回答
1

我找到了一个不需要触发事件的不错的解决方案:

@FXML
private Button cancelButton;

close(new Event(cancelButton, stage, null));

@FXML
private void close(Event event) {
    ((Node)(event.getSource())).getScene().getWindow().hide();                      
}
于 2016-04-25T08:57:57.943 回答