【问题标题】:How do I make only the top window active/clickable?如何仅使顶部窗口处于活动状态/可单击?
【发布时间】:2015-12-25 14:22:18
【问题描述】:

我正在创建一个 Java 应用程序,用户可以在其中单击菜单并选择“退出”。当他们单击“退出”时,会出现一个弹出对话框,询问“您确定要退出吗?”是或否的选项在那里,这些按钮工作正常。

当此对话框可见时,您仍然可以单击后面的窗口,这将使该窗口处于活动状态并将其置于弹出窗口上方。我不希望这种情况发生,我只希望弹出窗口处于活动状态并让它保持在顶部,直到用户单击是或否。这与窗口左上角的红色 X 相同 - 如果正在显示弹出窗口,我不希望用户能够单击它。有任何想法吗?我已经尝试使用

来消费该事件
event.consume();

我将它放在一个 if 语句中,用于显示 stage2(我的弹出框)何时显示,并且如果为 stage1(主窗口)调用 oncloserequest,则使用该事件。这工作正常,但一旦弹出框关闭(通过选择否),事件仍然被消耗。

另外,当弹出对话框显示时,您仍然可以点击它后面的stage1,弹出框将被发送到后面。

有人提到模态对话框?这是什么?我不明白

【问题讨论】:

标签: java javafx dialog popup


【解决方案1】:

有一个名为 stage.initOwner(Stage stg) 的属性允许这种情况发生。

例子:

public class JavaFXApplication4 extends Application {

@Override
public void start(Stage stage) {
   Button jb = new Button("Click");
   jb.setOnMouseClicked(new EventHandler() {
        @Override
           public void handle(Event event) {
               makeAnotherStage(stage);
           }
       });

       GridPane gp = new GridPane();
       gp.getChildren().add(jb);
       Scene s = new Scene(gp);

       stage.setScene(s);
       stage.show();

    }

    private void makeAnotherStage(Stage st){
        Stage s = new Stage();

        GridPane gp = new GridPane();
        Label l = new Label("Second Stage");
        gp.getChildren().add(l);
        Scene sc = new Scene(gp);

        s.initOwner(st);                        <------- initOwner
        s.initModality(Modality.WINDOW_MODAL);  <------- Modality property

        s.setScene(sc);
        s.requestFocus();
        s.show();
    }
}

关于模态的 Oracle 文档:https://docs.oracle.com/javafx/2/api/javafx/stage/Modality.html

来源: How to make the opened window must close at first before back to the main?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多