В чем разница между showandwait() и show() в классе Java FX Stage?

Я просмотрел документацию, но так и не понял, чего ждет первый метод и как это влияет на этап. Некоторые полезные примеры, демонстрирующие разницу между ними, будут оценены по достоинству.

Он ждет закрытия сцены.

James_D 18.12.2020 20:15

Вы читали JavaDoc для javafx.stage.Stage? В тексте страницы есть следующее утверждение: «Метод show() возвращает значение немедленно, независимо от модальности этапа. Используйте метод showAndWait(), если вам нужно заблокировать вызывающего абонента до тех пор, пока модальный этап не будет скрыт (закрыт). "

NomadMaker 18.12.2020 20:25
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
7
2
3 974
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Рассмотрим следующий пример

public class Demo extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage stage) {
        stage.setScene(new Scene(new Label("Demo")));
        stage.show();
        
        Stage inner = new Stage(){{setScene(new Scene(new Label("Inner"))); }};
        inner.show(); // Try replacing with showAndWait
        System.out.println("Done");
    }
}

Если вы запустите эту версию, inner.show() покажет второй этап и немедленно вернется, поэтому вы увидите Done на консоли.

Если вы замените inner.show() на inner.showAndWait(), метод не вернется и будет ждать, пока вы не закроете внутреннюю сцену, чтобы продолжить. Когда вы закроете внутреннюю сцену, только тогда на консоли появится надпись «Готово».

Спасибо, что объяснили мне это, но у меня есть еще один вопрос, если он вас не беспокоит. Почему showandwait на primaryStage выдает ошибки?

user12468082 18.12.2020 20:45

ShowAndWait() блокирует выполнение до закрытия этапа. show() возвращается немедленно.

Чтобы увидеть разницу, запустите следующую демонстрацию. При вызове show() текущее значение берется из текстового поля, вместо того, чтобы ждать, пока пользователь что-то введет и закроет окно. С showAndWait(), если вы вводите текстовое поле и закрываете окно, отображается введенный вами текст.

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class ShowAndWaitDemo extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        
        // Show:
        VBox showDemo = new VBox(15);
        showDemo.getChildren().add(new Label("User entered:"));
        Label showResult = new Label(" ");
        showDemo.getChildren().add(showResult);
        Button show = new Button("Show");
        show.setOnAction(e -> {
            InputDialog dialog = new InputDialog();
            dialog.getStage().show();
            // This will execute immediately, so it'll give the wrong result:
            showResult.setText(dialog.getResult());
        });
        showDemo.getChildren().add(show);

        // Show and wait:
        VBox showAndWaitDemo = new VBox(15);
        showAndWaitDemo.getChildren().add(new Label("User entered:"));
        Label showAndWaitResult = new Label(" ");
        showAndWaitDemo.getChildren().add(showAndWaitResult);
        Button showAndWait = new Button("Show and Wait");
        showAndWait.setOnAction(e -> {
            InputDialog dialog = new InputDialog();
            dialog.getStage().showAndWait();
            // This will not execute until the stage is closed, so it will give the correct result:
            showAndWaitResult.setText(dialog.getResult());
        });
        showAndWaitDemo.getChildren().add(showAndWait);
    
        HBox root = new HBox(25, showDemo, showAndWaitDemo);
        root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(root, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    
    private static class InputDialog {
        private final Stage stage ;
        private final TextField input ;
        
        InputDialog() {
            input = new TextField("Enter value here:");
            Button close = new Button("Close");
            VBox root = new VBox(5);
            root.setAlignment(Pos.CENTER);
            root.getChildren().addAll(input, close);
            Scene scene = new Scene(root, 400, 400);
            stage = new Stage();
            stage.initModality(Modality.APPLICATION_MODAL);
            close.setOnAction(e -> stage.hide());
            stage.setScene(scene);
        }
        
        Stage getStage() {
            return stage ;
        }
        
        String getResult() {
            return input.getText();
        }
    }
    
    public static void main(String[] args) {
        Application.launch(args);
    }

}

Другие вопросы по теме