Javafx 2 初始化中的NPE
在阅读之后,我得到了一个印象,一个initialize方法可以用作spring的AfterPropertieSet或EJB的@PostConstruct方法——当调用它时,所有成员变量都会被设置。但当我尝试时,我得到了NPE。我尝试的代码如下所示 主应用程序:Javafx 2 初始化中的NPE,javafx-2,fxml,Javafx 2,Fxml,在阅读之后,我得到了一个印象,一个initialize方法可以用作spring的AfterPropertieSet或EJB的@PostConstruct方法——当调用它时,所有成员变量都会被设置。但当我尝试时,我得到了NPE。我尝试的代码如下所示 主应用程序: public class MyApp extends Application { @Override public void start(Stage stage) throws Exception { P
public class MyApp extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/myapp.fxml"));///MAIN LOAD
Scene scene = new Scene(root, 320, 240);
scene.getStylesheets().add("/myapp.css");
stage.setScene(scene);
stage.setTitle("my app");
stage.show();
}
public static void main(String[] args) { launch(); }
}
myapp.fxml:
...
<VBox fx:id="root" xmlns:fx="http://javafx.com/fxml" >
<ControlA>
<SomeClass>
</SomeClass>
</ControlA>
</VBox>
组件的initialize方法是从其load方法调用的,其属性是从稍后调用的父级load方法设置的。而且看起来可以理解,在读取父fxml之前,无法构造组件的属性值。但是如果是这样的话,在使用组件之前和初始化所有道具之后初始化组件的最佳实践是什么
向您致意,尤金。您需要在控制器中实现接口。我的印象是,这只是控制器
@DefaultProperty("aproperty")
public class ControlA extends StackPane {
private SomeClass aproperty;
public ContentPane(){
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/controls/ControlA.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();//ControlA LOAD
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
public void initialize() {
//aproperty is null here, called from ControlA LOAD
}
//aproperty get/set
public void setAproperty(SomeClass p){//it is called from MAIN LOAD
....
}