JavaFX - 当主阶段关闭时关闭任何其他阶段,但允许它们隐藏在主阶段后面

Wat*_*ter 1 java javafx window

假设我正在创建的第二个窗口有以下代码:

    stage.initModality(Modality.NONE);
    stage.initOwner(coreController.getStage());
Run Code Online (Sandbox Code Playgroud)

如果我这样做,它会在我的主窗口关闭时关闭。

如果我注释掉stage.initOwner(coreController.getStage());,那么它将能够隐藏在主面板后面,但它不会关闭。

当我杀死主舞台时,有什么方法可以让它关闭...而无需编写代码来跟踪创建的每个新窗口?到目前为止,我似乎唯一的选择是将每个新窗口注册到列表中,当主窗口触发“关闭事件”时,我也会为所有其他窗口触发此事件。有没有一种方法可以做到这一点,而无需我像这样将所有东西连接在一起?

编辑:我使用 Modality.NONE ,这样窗口就不会阻止任何事件,但我不知道这是否与问题相关。

编辑2:我希望在退出主窗口时关闭所有窗口(如果我可以拦截关闭事件并进行清理,那就太好了)。

Jam*_*s_D 5

如果您只想关闭所有子窗口,但由于其他原因而保持应用程序运行(例如,您打开了同级窗口等...),那么我认为您必须按照问题中的建议自行管理(保持窗口列表并hide()单独调用它们等)。

如果您确实打算退出应用程序,那么您可以执行以下操作:

mainWindow.setOnHidden(e -> Platform.exit());
Run Code Online (Sandbox Code Playgroud)

这将导致 JavaFX 系统正常退出(这当然会导致其他每个窗口关闭)。

如果需要清理资源,可以stop()在应用程序子类中重写并清理该方法中的资源。stop()通过关闭应用程序时将被调用Platform.exit()(但请注意,如果您执行 a 则不会被调用System.exit(...))。

如果您需要在每个窗口的基础上清理资源,那么您可以onHidden()向每个窗口注册处理程序来执行此操作。请注意,如果您show()在隐藏后再次使用同一窗口实例,这意味着您可能需要恢复这些资源。不过,这个用例非常不典型。

这是一个简单的示例:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class ExitOnMainWindowClose extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button newWindowButton = new Button("New Window");
        newWindowButton.setOnAction(e -> showNewWindow());
        primaryStage.setScene(new Scene(new StackPane(newWindowButton), 120, 75));
        primaryStage.setOnHidden(e -> Platform.exit());
        primaryStage.show();
    }

    @Override
    public void stop() {
        System.out.println("Application-level cleanup...");
    }

    private void showNewWindow() {
        Stage stage = new Stage();
        stage.setScene(new Scene(new StackPane(new Label("New Window")), 180, 60));
        stage.setOnHidden(e -> System.out.println("Window-level cleanup..."));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)