2013-06-06 3 views
0

У меня есть этот код, который отображает диалоговое окно подтверждения для выхода из приложения.Этап скрыт, когда отображается диалог

public class DialogPanels 
{ 

    public void initClosemainAppDialog(final Stage primaryStage) 
    { 

     primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() 
     { 
      @Override 
      public void handle(WindowEvent event) 
      { 
       event.consume(); // Do nothing on close request 

       // Dialog Stage init 
       final Stage dialog = new Stage(); 
       dialog.initModality(Modality.APPLICATION_MODAL); 

       // Frage - Label 
       Label label = new Label("Exit from the program"); 


       // Button "Yes" 
       Button okBtn = new Button("Yes"); 
       okBtn.setOnAction(new EventHandler<ActionEvent>() 
       { 
        @Override 
        public void handle(ActionEvent event) 
        { 
         //primaryStage.close(); 
         //dialog.close(); 
         //Platform.exit();  
         System.exit(0); 
        } 
       }); 

       // Button "No" 
       Button cancelBtn = new Button("No"); 
       cancelBtn.setOnAction(new EventHandler<ActionEvent>() 
       { 
        @Override 
        public void handle(ActionEvent event) 
        { 
         primaryStage.show(); 
         dialog.close(); 
        } 
       }); 

       // Layout for the Button 
       HBox hbox = new HBox(); 
       hbox.setSpacing(10); 
       hbox.setAlignment(Pos.CENTER); 
       hbox.getChildren().add(okBtn); 
       hbox.getChildren().add(cancelBtn); 

       // Layout for the Label and hBox 
       VBox vbox = new VBox(); 
       vbox.setAlignment(Pos.CENTER); 
       vbox.setSpacing(10); 
       vbox.getChildren().add(label); 
       vbox.getChildren().add(hbox); 

       // Stage 
       Scene scene = new Scene(vbox); 
       dialog.setScene(scene); 
       dialog.show(); 
      } 
     }); 

    } 
} 

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

UPDATE

Я тестировал этот код, он работает, но когда отображается диалоговое окно MainStage не несет ответственности (замороженный). Как я могу объяснить основную сцену при отображении диалога?

ответ

1

Вам необходимо установить правильные отношения между этапами primaryStage и dialog. Вот подсказка, чтобы ты:

... 
dialog.initOwner(primaryStage); 
dialog.initModality(Modality.APPLICATION_MODAL); 
dialog.showAndWait(); 

Вы можете найти более подробную информацию в компании Oracle JavaFX 2 JavaDocs.

Больше пример кода (редактировать)

Я использую s etOnHiding(..) вместо setOnCloseRequest(..):

stage.setOnHiding(new AskUserIfHeReallyWantsToQuitWindowHandler(stage)); 

Я извлек свой код в отдельный класс обработчика событий и исправили проблемы я уже упоминал (извините, Я немного короткий по времени прямо сейчас):

public class AskUserIfHeReallyWantsToQuitWindowHandler implements EventHandler<WindowEvent> { 
    private final Stage primaryStage; 

    public AskUserIfHeReallyWantsToQuitWindowHandler(final Stage primaryStage) { 
        Objects.requireNonNull(primaryStage); 
     this.primaryStage = primaryStage; 
    } 

    @Override 
    public void handle(final WindowEvent event) { 

     event.consume(); 

     final Stage dialog = new Stage(); 

     final Button okBtn = new Button("Yes"); 
     okBtn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(final ActionEvent event) { 
       dialog.close(); 
       primaryStage.close(); 
      } 
     }); 

     // Button "No" 
     final Button cancelBtn = new Button("No"); 
     cancelBtn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(final ActionEvent event) { 
       dialog.close(); 

       Platform.runLater(new Runnable() { 

        @Override 
        public void run() { 
         primaryStage.show(); 
        } 
       }); 
      } 
     }); 

     // Layout for the Button 
     final HBox hbox = new HBox(); 
     hbox.setSpacing(10); 
     hbox.setAlignment(Pos.CENTER); 
     hbox.getChildren().add(okBtn); 
     hbox.getChildren().add(cancelBtn); 

     // Layout for the Label and hBox 
     final VBox vbox = new VBox(); 
     vbox.setAlignment(Pos.CENTER); 
     vbox.setSpacing(10); 
     vbox.getChildren().add(new Label("Do your really want to exit?")); 
     vbox.getChildren().add(hbox); 

     // Stage 
     final Scene scene = new Scene(vbox); 
     dialog.setScene(scene); 
     dialog.initOwner(primaryStage); 
     dialog.initModality(Modality.NONE); 

     dialog.showAndWait(); 
    } 
} 
+0

Это не работает должным образом. –

+0

Я пытаюсь помочь вам с закрытием основной стадии. В вашем коде есть много работы (например, используйте 'Platform.exit()'), потребляя событие и так далее. Что * точно * не работает должным образом? –

+0

Диалог отображается за основной сценой. –

1

Потребляйте событие закрытия и установить владельца сцены, если вы не хотите, чтобы увидеть другое окно, когда окна сведены к минимуму:

@Override 
public void handle(WindowEvent event) 
{ 
    event.consume(); // Do nothing on close request 

    // Dialog Stage init 
    final Stage dialog = new Stage(); 
    dialog.initModality(Modality.APPLICATION_MODAL); 
    dialog.initOwner(primaryStage); 

    // other stuff 
} 
}); 
+0

Да, это решает проблему. Еще один вопрос. Когда диалог отображается, основной этап заморожен (не отвечает за ожидание диалога), как я могу отобразить диалог, а также позволить основному кадру работать? –

+0

dialog.initModality (Modality.NONE) –

+0

Я изменил 'Modality' на NONE, но теперь основной этап закрыт, когда я показываю диалог (назад в начале). –

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