JavaFX的 - 挣钱的时候,主舞台被关闭任何其他阶段关闭,但允许他们到主舞台背后隐藏(JavaF

2019-10-23 04:24发布

让我们说我有我创建第二个窗口下面的代码:

    stage.initModality(Modality.NONE);
    stage.initOwner(coreController.getStage());

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

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

有什么办法得到它关闭时,我杀了主舞台...... 而无需编写代码来跟踪创建的每一个新的窗口? 到目前为止,似乎我唯一的选择是在一个列表中登记的每一个新的窗口,并在主窗口中发射了一枚“关闭事件”,我也火了这对所有其他窗口。 有没有办法做到这一点没有我不必去和连接到一起的一切那样?

编辑:我用Modality.NONE所以没有事件被窗口阻止,我不知道这是否是相关但这个问题。

编辑2:我想有都在附近在离开主窗口中的窗口(这将是一个奖金,如果我能拦截关闭事件并做清理工作太)。

Answer 1:

如果你只是想关闭所有的子窗口,但保持运行的应用程序的某些其他原因(例如,你有兄弟姐妹的窗户打开,等...),那么我认为你必须来管理自己,你的问题建议(保持窗户和呼叫列表hide()在他们的个人,等等)。

如果您确实打算退出应用程序,那么你可以这样做:

mainWindow.setOnHidden(e -> Platform.exit());

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

如果您需要清理的资源,你可以重写stop()在应用程序子类,并在该方法清理资源。 stop()将通过关闭应用程序时被调用为您Platform.exit()但要注意它不会被调用,如果你做一个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);
    }
}


Answer 2:

如果我理解正确的问题,您可以拨打initOwner(主级)为您需要的时候主要的一个被关闭的关闭每一个阶段。

只要添加一个参考的Oracle文档,这可以解释为什么initOwner(主级)不适合这种情况下:

甲阶段可任选地具有一个所有者Window。 当一个窗口是一个阶段的拥有者,这被认为是这一阶段的家长。 当关闭父窗口,它的所有后代窗口都关闭。 他申请了这个图标化父窗口相同的链接行为。 下一个阶段将永远是它的父窗口的顶部 。 舞台可见之前的所有者必须初始化。

来源: https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html#initOwner-javafx.stage.Window-



文章来源: JavaFX - Make any other stages close when the main stage is closed, yet allow them to be hidden behind the main stage