2015-12-25 3 views
1

Я создаю приложение Java, в котором пользователь может щелкнуть по меню и выбрать «exit». Когда они нажимают «exit», появляется всплывающее диалоговое окно с вопросом: «Вы уверены, что хотите выйти?» опция «да» или «нет» есть, и эти кнопки работают нормально.Как сделать только верхнее окно активным/кликабельным?

Когда это диалоговое окно видно, вы все равно можете щелкнуть по окну, и это сделает это окно активным и поместит его выше всплывающего окна. Я не хочу, чтобы это произошло, я хочу, чтобы всплывающее окно активно, и чтобы оно оставалось на вершине, пока пользователь не нажал «да» или «нет». То же самое для красного X в верхнем левом углу окна - я не хочу, чтобы пользователь мог щелкнуть по нему, если всплывающее окно отображается. Есть идеи? Я был пойти на потребляя событие с помощью

event.consume(); 

Я поместил это в, если заявление для того, когда stage2 (моя всплывающее окно) показывал, и если oncloserequest вызывается для stage1 (главного окна) то событие расходуется. Это прекрасно работает, но как только всплывающее окно закрывается (путем выбора нет), событие все еще потребляется.

Также, когда отображается всплывающее диалоговое окно, вы по-прежнему можете щелкнуть по сцене 1 за ним, и всплывающее окно будет отправлено обратно.

Кто-то упомянул модальные диалоговые окна? Что это? Я не понимаю

+1

См [Javadocs для 'Stage'] (https://docs.oracle.com/ javase/8/javafx/api/javafx/stage/Stage.html), в частности https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html#initModality-javafx.stage. Modality- –

ответ

1

Существует свойство stage.initOwner (Stage stg), которое позволяет это произойти.

Пример:

public class JavaFXApplication4 extends Application { 

@Override 
public void start(Stage stage) { 
    Button jb = new Button("Click"); 
    jb.setOnMouseClicked(new EventHandler() { 
     @Override 
      public void handle(Event event) { 
       makeAnotherStage(stage); 
      } 
     }); 

     GridPane gp = new GridPane(); 
     gp.getChildren().add(jb); 
     Scene s = new Scene(gp); 

     stage.setScene(s); 
     stage.show(); 

    } 

    private void makeAnotherStage(Stage st){ 
     Stage s = new Stage(); 

     GridPane gp = new GridPane(); 
     Label l = new Label("Second Stage"); 
     gp.getChildren().add(l); 
     Scene sc = new Scene(gp); 

     s.initOwner(st);      <------- initOwner 
     s.initModality(Modality.WINDOW_MODAL); <------- Modality property 

     s.setScene(sc); 
     s.requestFocus(); 
     s.show(); 
    } 
} 

Oracle Документация по модальности: https://docs.oracle.com/javafx/2/api/javafx/stage/Modality.html

Источник: How to make the opened window must close at first before back to the main?

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