JavaFX - 如何将焦点集中在一个舞台上

7
我的应用程序有一个主要的 Stage,可以从中打开第二个窗口。我想只关注一个 Stage。
我有两个问题需要解决:
1 - 如何将 焦点 仅放在 第二个 Stage 上(一个文件选择器 OpenDialog)? 即不能切换到主应用程序 Stage,直到用户点击打开或取消。
2 - 如何强制用户在关闭主 Stage 前 关闭第二个 Stage
目前,我可以在第二个阶段(OpenDialog)仍在运行时关闭主窗口。
谢谢。

为什么不直接将第一阶段作为参数传递给 showOpenDialog?创建一个仅用于对话框的第二阶段有点……无用。 - specializt
2个回答

14
您可以使用模态所有权的组合来控制阶段。 subStage.initOwner(stage) -> 确保子舞台随其所有者一起移动。 subStage.initModality(Modality.WINDOW_MODAL) -> 确保substage阻止输入事件从其所有者(父级)到其根部传递。
您也可以使用Modality.APPLICATION_MODAL,如果您想要阻止输入事件到同一应用程序的所有窗口,除了其子层次结构中的那些窗口。 对话框默认遵循模态和阻止方式。Dialog的默认模态是Modality.APPLICATION_MODAL,您可以添加initOwner(...)
注意:你不能将上述规则应用于 文件选择器。但你可以使用 showOpenDialog(Window ownerWindow) 来替代它。
fileChooser.showOpenDialog(stage);

完整示例

import javafx.application.Application;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class Main extends Application {

    @Override public void start(Stage stage) {

        stage.setTitle("Main Stage");
        stage.setWidth(500);
        stage.setHeight(500);
        stage.show();

        Stage subStage = new Stage();
        subStage.setTitle("Sub Stage");
        subStage.setWidth(250);
        subStage.setHeight(250);
        subStage.initOwner(stage);
        subStage.initModality(Modality.WINDOW_MODAL);
        subStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

如果它是一个文件选择器呢? - Mohamed Benmahdjoub
您不能将上述规则应用于FileChooser。但是,Dialog默认遵循模态和阻塞方式。Dialog的默认模式为Modality.APPLICATION_MODAL - ItachiUchiha
我的文件选择器无法实现这个功能,它只允许访问原始窗口,我可以给您代码吗? - Mohamed Benmahdjoub

1

如果只关注一个阶段并阻止其他阶段,请将以下内容应用于您希望在某个特定时间仅处于活动状态的阶段:

stage.initModality(Modality.APPLICATION_MODAL);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接