Подтвердить что ты не робот

Как я могу получить доступ к классу Controller в JavaFx 2.0?

Недавно я программировал программное обеспечение с JavaFx2.0, но я столкнулся с большой проблемой, то есть - как я могу получить доступ к классу Controller? Для каждого класса контроллера с тем же типом класса они могут действовать по-разному из-за модели, от которой она зависит, поэтому я хочу получить класс представления Controller и предоставить ему указанную модель, могу ли я это сделать? Я попытался получить контроллер с помощью FXMLLoader, но метод getController() возвращает null! Why?

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 (они из списка). Кто-нибудь может мне помочь? Спасибо большое!

4b9b3361

Ответ 1

Я использую следующее:

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

Ответ 2

В дополнение к ответу Alf, я хочу отметить, что код может быть короче:

URL location = getClass().getResource("MyController.fxml");

FXMLLoader fxmlLoader = new FXMLLoader();

Parent root = (Parent) fxmlLoader.load(location.openStream());

Это также работает.

Ответ 3

Вместо этого используйте getResourceAsStream:

anchorPane = loader.load(LightView.class.getResourceAsStream(fxmlFile));

Простая, хорошо работающая.

Ответ 4

Вы можете попробовать это...

    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();