2015-04-08 3 views
2

Мое приложение имеет основное приложение, которое открывает второе окно. Я хочу сосредоточиться только на одном этапе.JavaFX - Как сфокусироваться на одном этапе

У меня есть 2 проблемы, которые я хочу, чтобы решить:

1 - Как я могу поставить focus на only the second Stage (а fileChooser OpenDialog)? то есть я не могу переключиться на основную сцену приложения до тех пор, пока пользователь не нажмет кнопку «Открыть» или «Отмена».

2 - Как я могу обязать пользователя close the 2nd Stage before he can close the main Stage?

Прямо сейчас, я могу закрыть главное окно, пока 2-й этап (OpenDialog) все еще работает.

Спасибо.

+0

почему бы вам просто пройти первый этап в качестве параметра 'showOpenDialog'? Создание второго этапа только для вашего диалога является любопытным .... бесполезным ... – specializt

ответ

5

Вы можете использовать комбинации Modality и Ownership этапов.

subStage.initOwner(stage) -> Удостоверяется, что подэтаж перемещается вместе со своим владельцем.

subStage.initModality(Modality.WINDOW_MODAL) -> Гарантирует, что substage блоки входных событий не доходя все окна от его владельца (родителя) к своему корню.

Вы также можете использовать Modality.APPLICATION_MODAL, если вы хотите заблокировать входные события ко всем окнам из того же приложения, за исключением тех, что от его дочерней иерархии.

Dialog по умолчанию модальный и блокирующий способ. По умолчанию для Dialog используется Modality.APPLICATION_MODAL, и вы можете добавить initOwner(...).

Примечание:Вы не можете применять вышеизложенные правила FileChooser. Однако для этого вы можете использовать showOpenDialog(Window ownerWindow).

fileChooser.showOpenDialog(stage); 

Полный пример

import javafx.application.Application; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override public void start(Stage stage) { 

     stage.setTitle("Main Stage"); 
     stage.setWidth(500); 
     stage.setHeight(500); 
     stage.show(); 

     Stage subStage = new Stage(); 
     subStage.setTitle("Sub Stage"); 
     subStage.setWidth(250); 
     subStage.setHeight(250); 
     subStage.initOwner(stage); 
     subStage.initModality(Modality.WINDOW_MODAL); 
     subStage.show(); 
    } 

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

что делать, если это файл? – Calips

+0

Вы не можете применить вышеуказанные правила к [FileChooser] (http://docs.oracle.com/javase/8/javafx/api/javafx/stage/FileChooser.html). Но, по умолчанию [Dialog] (http://docs.oracle.com/javase/8/javafx/api/index.html?overview-summary.html) модально и блокируется. Модификатором по умолчанию для Dialog является 'Modality.APPLICATION_MODAL' – ItachiUchiha

+0

Мой файловый менеджер не делает этого, он позволяет получить доступ к исходному окну, могу ли я дать код PLZ? – Calips

0

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

stage.initModality(Modality.APPLICATION_MODAL);