如何在对话框打开时阻止事件到底层场景而不是窗口?

时间:2017-09-11 08:28:01

标签: javafx dialog modal-dialog javafx-8

基本上,我有一个应用程序可以打开大多数模态对话框,因为我不希望用户在对话框打开时能够继续在主应用程序中工作。但是,Modality.APPLICATION_MODALModality.WINDOW_MODAL都会阻止最小化和最大化窗口。当非对象事件触发对话并且用户已经最小化窗口时,这是一个问题 - >他再也无法打开它了。

现在我有一种解决方法,可以在用户的​​主屏幕上手动打开对话框。如果应用程序被最小化,我还可以简单地使对话非模态,但是然后他可以在应用程序中工作而忽略对话框。这两种解决方案都不是特别漂亮,也不是我想要的。

我知道它是一个“功能”但是真的没有办法与窗口互动而不是主人舞台的场景吗?也许是一种在不使用模态的情况下阻止用户事件到场景的方法?对我来说,这似乎是一个非常常见的用例。

这是一个简约的代码示例:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.ScrollPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class DialogDemo extends Application {

    @Override
    public void start(Stage primaryStage) {
        Stage mainStage = new Stage();
        Button showDialogBtn = new Button("show Dialog");
        showDialogBtn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                Dialog<ButtonType> dialog = new Dialog<ButtonType>();
                dialog.initStyle(StageStyle.DECORATED);
                dialog.initOwner(mainStage);
                //prevents mainStage from being resized, mini-/maximized and closed
                dialog.initModality(Modality.WINDOW_MODAL);
                dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
                dialog.show();
            }
        });
        ScrollPane pane = new ScrollPane(showDialogBtn);
        pane.setMinSize(600, 480);
        mainStage.setScene(new Scene(pane));
        mainStage.show();
    }

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

0 个答案:

没有答案