JavaFX 8创建未修饰的TextInputDialog,该对话框在全屏阶段显示为模态

JavaFX 8创建未修饰的TextInputDialog,该对话框在全屏阶段显示为模态,java,javafx,Java,Javafx,我有一个全屏的主应用程序阶段,希望在顶部显示一个文本输入对话框,带有模式样式(即,在向该阶段提供其他输入之前,必须先取消该对话框) 如果我将所有者设置为stage,将样式设置为UTILITY,那么它就可以工作 但是如果我想删除装饰(通过将样式设置为“未装饰”),那么对话框根本不会出现!我只能通过而不是设置父项使其显示 如果我没有设置父级,对话框会出现在舞台顶部,但如果我单击应用程序上的其他任何位置,它就会消失在全屏舞台后面 如何创建一个在全屏舞台上具有模态行为的未修饰对话框 // This wo

我有一个全屏的主应用程序阶段,希望在顶部显示一个文本输入对话框,带有模式样式(即,在向该阶段提供其他输入之前,必须先取消该对话框)

如果我将所有者设置为stage,将样式设置为UTILITY,那么它就可以工作

但是如果我想删除装饰(通过将样式设置为“未装饰”),那么对话框根本不会出现!我只能通过而不是设置父项使其显示

如果我没有设置父级,对话框会出现在舞台顶部,但如果我单击应用程序上的其他任何位置,它就会消失在全屏舞台后面

如何创建一个在全屏舞台上具有模态行为的未修饰对话框

// This works, but is decorated
TextInputDialog dialog = new TextInputDialog();
dialog.initOwner(stage);
dialog.initStyle(StageStyle.UTILITY);
dialog.showAndWait();

我已经做了一个完整的例子,这似乎是你尝试过的东西,但不起作用。在我的情况下,它工作得很好。窗口显示全屏,对话框出现在中间,没有窗口装饰

public class DialogCheck extends Application{

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("text field");
        BorderPane root = new BorderPane();
        Button b = new Button("dialog");
        root.setCenter(b);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setFullScreen(true);
        primaryStage.show();

        b.setOnAction((evt)->{ 
            TextInputDialog dialog = new TextInputDialog();
            dialog.initOwner(primaryStage);
            dialog.initStyle(StageStyle.UNDECORATED);
            dialog.showAndWait();
            });


    }

}
注意,这是osx上的Java11和OpenJFX11

对于某些添加的调试:

dialog.setOnShown( sevt ->{
            System.out.println("showing: " + dialog.isShowing() + ", " + dialog.getX());
            TextField field = dialog.getEditor();
            field.requestFocus();
            System.out.println(field.isFocused());
        });
还要注意使用“showAndWait”与“show”之间的区别

对话框。显示并等待
输出:

显示:错误,南。
假的

对话框。显示
输出:

显示:正确,621.0
真的


我已经做了一个完整的例子,这似乎是你尝试过的东西,但不起作用。在我的情况下,它工作得很好。窗口显示全屏,对话框出现在中间,没有窗口装饰

public class DialogCheck extends Application{

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("text field");
        BorderPane root = new BorderPane();
        Button b = new Button("dialog");
        root.setCenter(b);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setFullScreen(true);
        primaryStage.show();

        b.setOnAction((evt)->{ 
            TextInputDialog dialog = new TextInputDialog();
            dialog.initOwner(primaryStage);
            dialog.initStyle(StageStyle.UNDECORATED);
            dialog.showAndWait();
            });


    }

}
注意,这是osx上的Java11和OpenJFX11

对于某些添加的调试:

dialog.setOnShown( sevt ->{
            System.out.println("showing: " + dialog.isShowing() + ", " + dialog.getX());
            TextField field = dialog.getEditor();
            field.requestFocus();
            System.out.println(field.isFocused());
        });
还要注意使用“showAndWait”与“show”之间的区别

对话框。显示并等待
输出:

显示:错误,南。
假的

对话框。显示
输出:

显示:正确,621.0
真的


我想你会通过一个例子得到更好的结果。当然,添加了一些我正在尝试的例子。你能提供一个而不仅仅是几个片段吗?我无法在Windows 10上重现这个问题,至少在使用JavaFX 14时是如此(还没有尝试使用8)。我认为通过一个示例,您会得到更好的结果。当然,添加了一些我正在尝试的示例。您能提供一个而不是几个片段吗?我无法在Windows 10上重现这个问题,至少在使用JavaFX14时是这样(还没有尝试过8)。我想知道这是一个bug,还是需要其他东西才能让它工作。当我点击按钮时,没有对话框出现,但是按钮没有响应,因此对话框一定出现在后台,并且仍然阻止其他输入。我怀疑这是一个bug。我也同意你的评估,对话框已经显示,但它在另一个窗口后面。我添加了一些东西来帮助调试。也许请求焦点有助于将对话框拉到最前面,或者使用show而不是showAndWait可能值得检查一下是否阻塞了平台线程。不应该,但可能值得检查。CentOS 6上的JavaFX 8这不起作用。我想知道这是一个bug,还是需要其他东西才能让它工作。当我点击按钮时,没有对话框出现,但是按钮没有响应,因此对话框一定出现在后台,并且仍然阻止其他输入。我怀疑这是一个bug。我也同意你的评估,对话框已经显示,但它在另一个窗口后面。我添加了一些东西来帮助调试。也许请求焦点有助于将对话框拉到最前面,或者使用show而不是showAndWait可能值得检查一下是否阻塞了平台线程。不应该,但可能值得检查一下。