2016-11-23 10 views
0

JavaFXアプリケーションをコーディングしています。私はSceneBuilder 8.2でGUIを作成しました。 私は既にChoiceBoxをいくつか入れましたが、カスタムTypeではなくJava Typeを使用しました。 それはうまく動作します。 しかし、カスタム型では、choiceBoxはインスタンス化されていません、なぜですか?JavaFXカスタムChoiceBoxが起動時にインスタンス化されない

public class PelController { 
    //instanciation is OK 
    @FXML 
    private ChoiceBox<PeriodeEnum> fCalculInteret; 

    //not instanciated at launch 
    @FXML 
    private ChoiceBox<DureeChoiceBoxElement> duree; 

/** 
    * Initializes the controller class. This method is automatically called 
    * after the fxml file has been loaded. 
    */ 
    @FXML 
    private void initialize() { 
//fCalculInteret is NOT NULL, automatically instantiated at startup. 
fCalculInteret.valueProperty().bindBidirectional(pel.fCalculInteretProperty()); 
//duree is NULL causing NullPointerException 
duree.valueProperty().get().dureeProperty().bindBidirectional(pel.dureeProperty()); 
    } 
} 

カスタムタイプ:

public class DureeChoiceBoxElement extends ObservableValueBase<DureeChoiceBoxElement> { 

    private IntegerProperty duree; 

    public DureeChoiceBoxElement() { 

    } 

    public DureeChoiceBoxElement(int duree) { 
     this.duree = new SimpleIntegerProperty(duree); 
    } 

    public IntegerProperty dureeProperty() { 
     return duree; 
    } 

    public Integer getDuree() { 
     return duree.getValue(); 
    } 

    @Override 
    public DureeChoiceBoxElement getValue() { 
     // TODO Auto-generated method stub 
     return new DureeChoiceBoxElement(duree.get()); 
    } 

    public void setDuree(Integer duree) { 
     this.duree.setValue(duree); 
    } 

    @Override 
    public String toString() { 
     return duree + " an"; 
    } 

} 

あなたはなぜこの発生する、NullPointerを説明することができ、コードの下 。おかげ

答えて

0
duree.valueProperty().get().dureeProperty().bindBidirectional(pel.dureeProperty());   

           |         |   

- >ヌルは、多分それは方法と思われフム

|から来ている:

public IntegerProperty dureeProperty() { 
     return duree; 
} 

リターンがデフォルトconstuctorがdureeプロパティを初期化しない原因はnull。


1)一つの解決策は、に方法を変更することです:

//lazy 
public IntegerProperty dureeProperty() { 
     if(duree == null) //if duree has not been initialized 
     duree = new SimpleIntegerProperty(); 
     return duree; 
} 

または2)あなたはprivate IntegerProperty duree;プロパティを初期化するデフォルトコンストラクタを変更することができ、解決策1が優れているものの、 。

+0

NULLポインタは変数から来ている:プライベートChoiceBox duree。 "duree"はNULLですが、私は他のChoiceBoxのように@FXML注釈を入れます –

+0

@FrançoisF.私は 'private IntegerProperty duree;'を意味します。コードを指定されたものに置き換えてみて、それが動作しない場合はエラースタックトレースを追加してください質問: – GOXR3PLUS

+0

duree ChoiceBoxの私の間違いは、問題はFXMLファイルであった。しかし、あなたに答えるために、bindDirectionalを設定してください。このようにして、別のIntegerPropertyがプライベートIntegerProperty dureeと比較して正しいDureeChoiceBoxElement項目を選択できるようにしたいと思います。値。私はこのようにしています。ありがとう。 –

0

私の問題は、自分自身(間違い)によって解決された

関連する問題