Как я могу получить доступ к классу 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));

Это просто, хорошо работает.

Другие вопросы по тегам