2012-10-24 77 views
0

讀完introduction_to_fxml之後,我得到一個印象,即initialize方法可以用作spring的afterPropertiesSet或EJB的@PostConstruct方法 - 期望所有成員變量在被調用時設置。但是當我嘗試時,我得到了NPE。我嘗試的代碼如下所示。初始化中的NPE

主要應用:

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> 

ControlA.java:

@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 
    .... 
} 

該組件的初始化方法是從它的負載方法調用,並且它的屬性是從稍後調用的父裝載方法設置。它看起來很容易理解,在讀取父fxml之前,組件的屬性值不能構造。但是如果是這樣的話,在組件初始化之前初始化一個組件的最佳實踐是什麼?

最好的問候,尤金。

回答

0

您需要在控制器中實現接口Initializable。我的印象是這隻適用於控制器。