Как обратиться к primaryStage
Я использую .fxml-Files для слоя представления моего приложения. Каждый fxml имеет прикрепленный к нему контроллер
<AnchorPane fx:controller="movielistjavafx.view.MainWindowController">
Предположим, что у меня есть mainFrame и его контроллер. Файл mainFrame.fxml загружается в start(Stage)
-метод.
Теперь вы хотите показать fileChooser, который привязан к Stage/Window/Whatever.
Для этого было бы хорошо сообщить fxml-контроллеру о том, например, primaryStage
.
Есть ли способ внедрить его в контроллер или знает ли FXML во время выполнения, к какому сценарию и стадии он принадлежит?
Единственная идея, которую я имею, это хранить primaryStage в каком-то статическом контексте, но это не похоже на способ сделать это для меня.
Ответы
Ответ 1
Not FXML, но узлы (элементы управления) в FXML (или в своем контроллере) знают, к какой сцене и стадии они принадлежат во время выполнения (после добавления в сцену).
В классе контроллера
...
@FXML private Label label;
...
// in some method block
Stage stageTheLabelBelongs = (Stage) label.getScene().getWindow();
В качестве альтернативы вы можете использовать события CDI для получения основного этапа. Посмотрите запись в блоге FXML и JavaFX, работающие на CDI и JBoss Weld.
Ответ 2
http://code.makery.ch/java/javafx-2-tutorial-part5
Вот хороший учебник для этого с примером кода примера
Controller...
//Application class type variable
public MainApp mainApp;
public Stage stage;
.........
.........
/**
* Is called by the main application to give a reference back to itself.
*
* @param mainApp
*/
public void setMainApp(MainApp mainApp) {
this.mainApp = mainApp;
}
}
.....
.........
@FXML
public void initialize(){
stage=mainApp.getStage();
}
Application class....
class MainApp extends Application{
Stage stage;
...
...
@Override
public void start(Stage stage) {
this.stage=stage;
FXMLLoader loader = new
FXMLLoader(MainApp.class.getResource("view/PersonOverview.fxml"));
PersonOverviewController controller = loader.getController();
controller.setMainApp(this);
}
...
,,
public getStage()
{
return this.stage;
}
}
Ответ 3
Надежное решение (может использоваться как фрагмент): Возьмите событие, а затем получите управление, которое произвело это событие. Используйте этот элемент управления для получения сцены:
@FXML
private void browseDirectory(ActionEvent event) {
Stage stage = Stage.class.cast(Control.class.cast(event.getSource()).getScene().getWindow());
DirectoryChooser directoryChooser = new DirectoryChooser();
File selectedDirectory = directoryChooser.showDialog(stage);
System.out.println(selectedDirectory.getAbsolutePath());
}