Как я могу получить доступ к классу Controller в JavaFx 2.0?
Недавно я программировал программное обеспечение для JavaFx2.0, но столкнулся с большой проблемой, а именно: как я могу получить доступ к классу Controller? Для каждого класса контроллера с одним и тем же типом класса они могут действовать по-разному из-за модели, от которой это зависит, поэтому я хочу получить класс Controller представления и предоставить ему указанную модель, могу ли я сделать это? Я пытался получить контроллер с помощью FXMLLoader, но метод getController() возвращает ноль! Почему?
1.LightView.java
FXMLLoader loader = new FXMLLoader();
anchorPane = loader.load(LightView.class.getResource(fxmlFile));//fxmlFile = "LightView.fxml"
//controller = (LightViewController) loader.getController();//fail to get controller!it is null
//I want to -> controller.setLight(light);
2.LightView.fxml
<AnchorPane ... fx:controller="light.LightViewController" >
3.LightViewController.java
....
private Light light;
public void initialize(URL arg0, ResourceBundle arg1)
4.Light.java
.... a simple pojo
поэтому я хочу предоставить каждому LightViewController указанный объект Light(они из списка). Может кто-нибудь мне поможет? Спасибо большое!
4 ответа
Я использую следующее:
URL location = getClass().getResource("MyController.fxml");
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
Parent root = (Parent) fxmlLoader.load(location.openStream());
В этом случае fxmlLoader.getController()
не является null
В дополнение к ответу Альфа хочу отметить, что код может быть короче:
URL location = getClass().getResource("MyController.fxml");
FXMLLoader fxmlLoader = new FXMLLoader();
Parent root = (Parent) fxmlLoader.load(location.openStream());
Это работает также.
Вы можете попробовать это...
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("LightView.fxml"));
loader.load();
Parent parent = loader.getRoot();
Scene Scene = new Scene(parent);
Stage Stage = new Stage();
LightViewController lv = loader.getController();
lv.setLight(light);
Stage.setScene(Scene);
Stage.show();
Использование getResourceAsStream
вместо:
anchorPane = loader.load(LightView.class.getResourceAsStream(fxmlFile));
Это просто, хорошо работает.