Доступ к классу контроллера FXML
Я хотел бы общаться с классом контроллера FXML в любое время, чтобы обновлять информацию на экране с основного приложения или других этапов.
Возможно ли это? Я не нашел способа сделать это.
Статические функции могут быть способом, но у них нет доступа к элементам управления формой.
Любые идеи?
Ответы
Ответ 1
Вы можете получить контроллер от FXMLLoader
FXMLLoader fxmlLoader = new FXMLLoader();
Pane p = fxmlLoader.load(getClass().getResource("foo.fxml").openStream());
FooController fooController = (FooController) fxmlLoader.getController();
сохранить его на основной стадии и предоставить getFooController() метод getter.
Из других классов или этапов каждый раз, когда вам нужно обновить загруженную страницу "foo.fxml", спросите ее у своего контроллера:
getFooController().updatePage(strData);
updatePage() может выглядеть примерно так:
// ...
@FXML private Label lblData;
// ...
public void updatePage(String data){
lblData.setText(data);
}
// ...
в классе FooController.
Таким образом, другие пользователи не беспокоятся о внутренней структуре страницы, как и где Label lblData
.
Также посмотрите fooobar.com/questions/132947/.... В JavaFX 2.2 улучшена FXMLLoader
.
Ответ 2
Еще одно решение - установить контроллер из вашего класса контроллера, например...
public class Controller implements javafx.fxml.Initializable {
@Override
public void initialize(URL location, ResourceBundle resources) {
// Implementing the Initializable interface means that this method
// will be called when the controller instance is created
App.setController(this);
}
}
Это решение, которое я предпочитаю использовать, поскольку код несколько запутан, чтобы создать полностью функциональный экземпляр FXMLLoader, который правильно обрабатывает локальные ресурсы и т.д.
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml"));
}
против
@Override
public void start(Stage stage) throws Exception {
URL location = getClass().getResource("/sample.fxml");
FXMLLoader loader = createFXMLLoader(location);
Parent root = loader.load(location.openStream());
}
public FXMLLoader createFXMLLoader(URL location) {
return new FXMLLoader(location, null, new JavaFXBuilderFactory(), null, Charset.forName(FXMLLoader.DEFAULT_CHARSET_NAME));
}
Ответ 3
Просто чтобы помочь прояснить принятый ответ и, возможно, сэкономить немного времени для других, которые являются новыми для JavaFX:
Для приложения JavaFX FXML NetBeans автоматически сгенерирует ваш метод запуска в основном классе следующим образом:
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
Теперь все, что нам нужно сделать, чтобы получить доступ к классу контроллера, заключается в изменении метода FXMLLoader load()
от статической реализации до инстанцированной реализации, а затем мы можем использовать метод экземпляра для получения контроллера, например:
//Static global variable for the controller (where MyController is the name of your controller class
static MyController myControllerHandle;
@Override
public void start(Stage stage) throws Exception {
//Set up instance instead of using static load() method
FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
Parent root = loader.load();
//Now we have access to getController() through the instance... don't forget the type cast
myControllerHandle = (MyController)loader.getController();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
Ответ 4
При загрузке объекта с главного экрана одним из способов передачи данных, которые я нашел и работает, является использование поиска, а затем установка данных внутри невидимой метки, которую я могу получить позже из класса контроллера. Вот так:
Parent root = FXMLLoader.load(me.getClass().getResource("Form.fxml"));
Label lblData = (Label) root.lookup("#lblData");
if (lblData!=null) lblData.setText(strData);
Это работает, но должен быть лучший способ.