JavaFX - 在主阶段关闭时关闭任何其他阶段,但允许它们隐藏在主阶段后面
JavaFX - Make any other stages close when the main stage is closed, yet allow them to be hidden behind the main stage
假设我有以下代码 window 我正在创建:
stage.initModality(Modality.NONE);
stage.initOwner(coreController.getStage());
如果我这样做,它会在我的主 window 关闭时关闭。
如果我注释掉stage.initOwner(coreController.getStage());
,那么它就可以隐藏在主面板后面,但是不会关闭
有什么方法可以在我杀死主舞台时关闭它...无需编写代码来跟踪每一个新创建的window?到目前为止,我唯一的选择似乎是在列表中注册每个新的 window,当主 window 触发了 'close event' 时,我也会为所有其他 [=32] 触发=].有没有一种方法可以做到这一点,而不必像那样进入并将所有东西连接在一起?
编辑:我用了Modality.NONE这样就不会有事件被window屏蔽了,不知道跟这个有没有关系然而问题。
编辑 2: 我想在退出主 window 时关闭所有 windows (如果我能拦截,那将是一个奖励关闭事件并进行清理。
如果我正确理解了问题,您可以在主阶段关闭时为每个需要关闭的阶段调用 initOwner(mainStage)。
只需添加对 Oracle 文档的引用,这就解释了为什么 initOwner(mainStage) 不适合这种情况:
A stage can optionally have an owner Window. When a window is a stage's owner, it is said to be the parent of that stage. When a parent window is closed, all its descendant windows are closed. The same chained behavior applied for a parent window that is iconified. A stage will always be on top of its parent window. The owner must be initialized before the stage is made visible.
发件人:https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html#initOwner-javafx.stage.Window-
如果您只想关闭所有子 windows,但出于其他原因保留应用程序 运行(例如,您有同级 windows 打开等...)那么我认为您必须按照问题中的建议自行管理(保留 windows 的列表并单独调用 hide()
等)。
如果您真的打算退出应用程序,那么您可以这样做:
mainWindow.setOnHidden(e -> Platform.exit());
这将导致 JavaFX 系统正常退出(这当然会导致其他每个 windows 关闭)。
如果您需要清理资源,您可以在您的应用程序子类中覆盖 stop()
并在该方法中清理资源。 stop()
将在通过 Platform.exit()
关闭应用程序时为您调用(但请注意,如果您执行 System.exit(...)
则不会调用它)。
如果您需要在每个 window 的基础上清理资源,那么您可以为每个 window 注册 onHidden()
个处理程序来执行此操作。请注意,如果您随后 show()
隐藏了相同的 window 实例,这意味着您可能需要恢复这些资源。这个用例虽然很不典型。
这是一个准系统示例:
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);
}
}
假设我有以下代码 window 我正在创建:
stage.initModality(Modality.NONE);
stage.initOwner(coreController.getStage());
如果我这样做,它会在我的主 window 关闭时关闭。
如果我注释掉stage.initOwner(coreController.getStage());
,那么它就可以隐藏在主面板后面,但是不会关闭
有什么方法可以在我杀死主舞台时关闭它...无需编写代码来跟踪每一个新创建的window?到目前为止,我唯一的选择似乎是在列表中注册每个新的 window,当主 window 触发了 'close event' 时,我也会为所有其他 [=32] 触发=].有没有一种方法可以做到这一点,而不必像那样进入并将所有东西连接在一起?
编辑:我用了Modality.NONE这样就不会有事件被window屏蔽了,不知道跟这个有没有关系然而问题。
编辑 2: 我想在退出主 window 时关闭所有 windows (如果我能拦截,那将是一个奖励关闭事件并进行清理。
如果我正确理解了问题,您可以在主阶段关闭时为每个需要关闭的阶段调用 initOwner(mainStage)。
只需添加对 Oracle 文档的引用,这就解释了为什么 initOwner(mainStage) 不适合这种情况:
A stage can optionally have an owner Window. When a window is a stage's owner, it is said to be the parent of that stage. When a parent window is closed, all its descendant windows are closed. The same chained behavior applied for a parent window that is iconified. A stage will always be on top of its parent window. The owner must be initialized before the stage is made visible.
发件人:https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html#initOwner-javafx.stage.Window-
如果您只想关闭所有子 windows,但出于其他原因保留应用程序 运行(例如,您有同级 windows 打开等...)那么我认为您必须按照问题中的建议自行管理(保留 windows 的列表并单独调用 hide()
等)。
如果您真的打算退出应用程序,那么您可以这样做:
mainWindow.setOnHidden(e -> Platform.exit());
这将导致 JavaFX 系统正常退出(这当然会导致其他每个 windows 关闭)。
如果您需要清理资源,您可以在您的应用程序子类中覆盖 stop()
并在该方法中清理资源。 stop()
将在通过 Platform.exit()
关闭应用程序时为您调用(但请注意,如果您执行 System.exit(...)
则不会调用它)。
如果您需要在每个 window 的基础上清理资源,那么您可以为每个 window 注册 onHidden()
个处理程序来执行此操作。请注意,如果您随后 show()
隐藏了相同的 window 实例,这意味着您可能需要恢复这些资源。这个用例虽然很不典型。
这是一个准系统示例:
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);
}
}