从Controller设置参考应用程序?

时间:2014-09-28 07:53:27

标签: java javafx javafx-2 javafx-8 fxml

JAVAFX的新手,所以这可能是一个简单的修复,但我在使用FXML文件的应用程序设置中有控制器。我引用控制器通过FXML文件使用并加载文件我在我的Application类

中使用以下代码
private void replaceScene(String resource) {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource(resource));

        Pane screen = (Pane) loader.load();
        Scene scene = new Scene(screen);
        scene.getStylesheets().addAll(getClass().getResource("/css/application.css").toExternalForm());
        stage.setScene(scene);
        stage.sizeToScene();

        IControlledScreen controller = (IControlledScreen) loader.getController();
        controller.setApp(this);
    } catch (Exception e) {
        System.out.println("Cannot load resource " + resource);
        System.out.println(e.getMessage());
    }
}

这是一个基本的控制器

public class MyController implements IControlledScreen {

    MyApplication app;

    public void setApp(MyApplication application) {
        app = application;
    }


    @FXML
    public Button btnStart;

    // Initialises the controller class.
    @FXML
    protected void initialize() {
        btnStart.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // code here
            }

        });
    }

}

我还有一个名为IControlledScreen的接口来设置对应用程序的引用

public interface IControlledScreen { 

    // ALlows us a reference to the application
    public void setApp(MyApplication app); 

}

现在一切正常,直到我尝试在初始化事件期间访问app变量。因此,将上述控制器更改为此现在会中断,因为app = NULL。

public class MyController implements IControlledScreen {

    MyApplication app;

    public void setApp(MyApplication application) {
        app = application;
    }


    @FXML
    public Button btnStart;

    // Initialises the controller class.
    @FXML
    protected void initialize() {
        // HERE app = NULL
        app.GetSomeProperty = "";
    }

}

我怎么能绕过这个?

1 个答案:

答案 0 :(得分:0)

我认为你必须改变你的设计。 在FXMLLoader.load()期间调用initialize方法 所以调用堆栈就像

..replaceScene
..loader.load
....MyController.initialize()
..loader.getController
..controller.setApp(app)

如果您真的必须从控制器内部访问该应用程序,则需要将其设为单例。