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 = "";
}
}
我怎么能绕过这个?
答案 0 :(得分:0)
我认为你必须改变你的设计。 在FXMLLoader.load()期间调用initialize方法 所以调用堆栈就像
..replaceScene
..loader.load
....MyController.initialize()
..loader.getController
..controller.setApp(app)
如果您真的必须从控制器内部访问该应用程序,则需要将其设为单例。