Я считаю, что проблема заключается в порядке показа окон.Проверка этого с помощью следующего позволила воспроизвести проблему в Windows 10 (с использованием JavaFX 12.0.1):
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
var alert = new Alert(AlertType.INFORMATION);
alert.initModality(Modality.APPLICATION_MODAL);
alert.setHeaderText(null);
alert.setContentText("This is a test of application modality.");
alert.show();
primaryStage.setScene(new Scene(new StackPane(new Label("Hello, World!")), 500, 300));
primaryStage.show();
}
}
Приведенное выше диалоговое окно не является модальным.Однако, если вы переместите alert.show()
на после primaryStage.show()
, все будет работать, как ожидалось.
Поскольку вы показываете Alert
в методе initialize()
контроллера FXML, этоскорее всего, этот код выполняется до того, как вы покажете свое главное окно.Если вы хотите отобразить Alert
в самом начале вашего приложения, есть как минимум две опции:
Вызов show()
внутри вызова Platform.runLater
, как вы это делаете в ваш ответ .
- Недостатком этого является то, что он делает ваш код сильно зависимым от, казалось бы, не связанного кода.Например, если по какой-либо причине вы измените способ и время отображения вашего основного окна, эта опция может выйти из строя.
Добавить метод в ваш класс Controller
и вызвать егопосле показа другого окна.
@Override
public void start(Stage primaryStage) throws IOException {
FXMLLoader loader = new FXMLLoader(/*location*/);
primaryStage.setScene(new Scene(loader.load()));
primaryStage.show();
loader.<Controller>getController().showMyAwesomeAlert();
}