web-dev-qa-db-ja.com

JavaFx 2.0でControllerクラスにアクセスするにはどうすればよいですか?

最近、JavaFx2.0を使用してソフトウェアをプログラミングしていましたが、大きな問題が発生しました。つまり、Controllerクラスにアクセスするにはどうすればよいですか。同じクラスタイプのコントローラークラスごとに、依存するモデルによって動作が異なる場合があるため、ビューのControllerクラスを取得して、指定されたモデルを提供したいのですが、これを実行できますか? FXMLLoaderでコントローラーを取得しようとしましたが、getController()メソッドがnullを返します!なぜですか?

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に指定されたライトオブジェクトを提供することです(それらはリストからのものです)。誰か助けてもらえますか?

15
yinger090807

私は以下を使用します:

_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ではありません

49
Alf

Alfの回答に加えて、コードを短くすることができることに注意してください。

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

FXMLLoader fxmlLoader = new FXMLLoader();

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

これも同様に機能します。

5
ITurchenko

あなたはこれを試すことができます...

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

代わりにgetResourceAsStreamを使用してください:

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

そのシンプルで、うまく機能します。

0
panoet