2016-04-28 2 views
2

Почему диалоговое окно (Предупреждение) в javafx отображается неправильно, если владелец сведен к минимуму.Javafx Dialog (Alert) не отображается, если владелец сведен к минимуму

взгляд на следующий код:

public class JavaFxSample2 extends Application { 

@Override 
public void start(Stage primaryStage) throws InterruptedException, ExecutionException { 
    primaryStage.setTitle("open alert in 2 seconds"); 
    Pane pane = new Pane(); 
    Button b = new Button("open dialog"); 
    b.setOnMouseClicked(event -> { 
     Task<Void> task = new Task<Void>() { 
      @Override 
      protected Void call() throws Exception { 
       Thread.sleep(2000); 
       return null; 
      } 
     }; 
     task.stateProperty().addListener((observable, oldValue, newValue) -> { 
      if (newValue == State.SUCCEEDED) { 
       Alert alert = new Alert(AlertType.INFORMATION, "Hello"); 
       alert.initOwner(primaryStage);     
       alert.showAndWait(); 
      } 
     }); 
     Thread thread = new Thread(task); 
     thread.start(); 
    }); 

    pane.getChildren().add(b); 

    Scene scene = new Scene(pane, 300, 275); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

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

Если свернуть приложение в 2-х секунд, а затем увеличить его снова (после 2-х секунд) вы не увидите диалоговое окно, но там как-то (этап заблокирован, пока вы не нажмете esc или не введите)

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

это ошибка? я делаю это неправильно?

Edit: Система Windows 7, Java 1.8.0.66

Edit2: Ok. кажется, что это действительно ошибка: https://bugs.openjdk.java.net/browse/JDK-8151170

ответ

5

Найдено (возможно) решение. Но это действительно хорошее решение?

перед показом оповещения я выполняю следующую строку:

((Stage) alert.getOwner()).setIconified(false); 

Если кто-то имеет более лучшую идею я буду удалять мой ответ.

0

Если вы добавите это заявление перед отображением диалогового окна предупреждения, вам не нужно будет нажимать Esc или Enter. Это освободит вас от замораживания вашего приложения.

alert.initModality(Modality.NONE); 
+0

Да, мне не нужно нажимать esc или вводить сейчас. Но Диалог также не отображается. Поэтому ответ неправильный – griFlo

0
DaoAlloyGeneral a = (DaoAlloyGeneral) tabelaAlloy.getSelectionModel().getSelectedItem(); 
      Alert alert = new Alert(AlertType.CONFIRMATION); 
      alert.setTitle(DaoCfgIdiomas.getTraducao("general.Confirmacao")); 
      alert.setHeaderText(DaoCfgIdiomas.getTraducao("general.Atencao")); 
      alert.setContentText(DaoCfgIdiomas.getTraducao("MainTabAlloy.msgDeletar") + " " +a.getNome()); 
      alert.setResizable(true); 
      alert.getDialogPane().setPrefSize(480, 320); 
      Optional<ButtonType> result = alert.showAndWait(); 
      if (result.get() == ButtonType.OK){ 

       DaoAlloyGeneral.deletarAlloy(a.getIdAlloy()); 
       tabelaAlloy.getItems().clear(); 
       tabelaAlloy.setItems(DaoAlloyGeneral.buscaTodos()); 
      } 

enter image description here

я наклоняю понял, что работал раньше и теперь, остановить. Oracle jdk1.8.0_111 Linux машина

EDIT: Я нашел проблему, JVM аргумент - Dcom.sun.javafx.isEmbedded = истинный Без этой опции она работала.

Смежные вопросы