如何仅使顶部窗口处于活动/可点击状态?

时间:2015-12-25 14:22:19

标签: java javafx box pop

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

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

来消费这个活动了
event.consume();

我把它放在if语句中,当stage2(我的弹出框)显示时,如果为stage1(主窗口)调用oncloserequest,那么事件就被消耗了。这工作正常,但一旦弹出框关闭(通过选择否),事件仍然被消耗。

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

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

1 个答案:

答案 0 :(得分: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?