基本上,我有一个应用程序可以打开大多数模态对话框,因为我不希望用户在对话框打开时能够继续在主应用程序中工作。但是,Modality.APPLICATION_MODAL
和Modality.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);
}
}