JavaFX 8 Создайте Undecorated TextInputDialog, который выглядит как модальный на стадии полного экрана - PullRequest
1 голос
/ 18 марта 2020

У меня полноэкранный основной этап приложения, и я хочу, чтобы TextInputDialog отображался сверху с модальным стилем (т. Е. Диалоговое окно должно быть закрыто, прежде чем вводить другие данные для этапа).

Если я установил владелец сцены и стиль UTILITY, тогда он работает.

Но если я хочу удалить украшение (установив стиль в UNDECORATED), тогда диалог вообще не появится! Я могу только заставить его появляться, если не установить родителя.

Если я не установил родителя, диалоговое окно появляется в верхней части сцены, но если я щелкну где-нибудь еще на Приложение исчезает за полноэкранной сценой.

Как создать неокрашенное диалоговое окно с модальным поведением на полноэкранной сцене?

// This works, but is decorated
TextInputDialog dialog = new TextInputDialog();
dialog.initOwner(stage);
dialog.initStyle(StageStyle.UTILITY);
dialog.showAndWait();
// This doesn't show at all (probably appears underneath the stage?)
TextInputDialog dialog = new TextInputDialog();
dialog.initOwner(stage);
dialog.initStyle(StageStyle.UNDECORATED);
dialog.showAndWait();
// This still allows clicking in the stage while dialog shown. Also causes
// "exit" of fullscreen by showing task bar when dialog is shown
TextInputDialog dialog = new TextInputDialog();
dialog.initStyle(StageStyle.UNDECORATED);
dialog.showAndWait();

1 Ответ

0 голосов
/ 18 марта 2020

Я сделал полный пример, который, кажется, что-то вы пробовали, но не работает. В моем случае это прекрасно работает, хотя. Окно показывает полный экран, и диалог появляется в центре без окна украшений.

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();
            });


    }

}

Обратите внимание, что это с java 11 & openjfx 11 на osx.

Для некоторых добавленных отладок:

dialog.setOnShown( sevt ->{
            System.out.println("showing: " + dialog.isShowing() + ", " + dialog.getX());
            TextField field = dialog.getEditor();
            field.requestFocus();
            System.out.println(field.isFocused());
        });

Также обратите внимание на разницу между использованием 'showAndWait' и 'show'.

Dialog.showAndWait output:

показ: false, NaN.
false

Dialog.show вывод:

показ: true, 621.0
true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...