2016-11-29 25 views
0

我在JavaFX中的GUI上有一個組合框。 該組合框是由一個複雜類型元素:對象和SimpleIntegerProperty之間的綁定

public class DureeChoiceBoxElement extends ObservableValueBase<DureeChoiceBoxElement> { 

    private IntegerProperty duree; 

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

我要地圖(或綁定)與我的模型選擇的複雜元素包含簡單類型:

public class Pel { 
private IntegerProperty duree = new SimpleIntegerProperty(1); 

public Property<Number> dureeProperty() { 
     return duree; 
    } 

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

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

} 

怎麼辦它呢?

我在控制器中試圖用:

public class PelController { 

    @FXML 
     private ChoiceBox<DureeChoiceBoxElement> duree; 
//etc.. 
     pel.dureeProperty().bind(createElapsedBindingByBindingsAPI2(duree.getValue())); 

     /* 
      * @return an ObjectBinding of immutable TimeElapsed objects for the player 
      */ 
      private ObjectBinding<Property<Number>> createElapsedBindingByBindingsAPI2(
        final DureeChoiceBoxElement dureeChoiceBoxElement) { 

       return Bindings.createObjectBinding(new Callable<Property<Number>>() { 
        @Override 
        public IntegerProperty call() throws Exception { 
         return dureeChoiceBoxElement.dureeProperty(); 
        } 
       }, dureeChoiceBoxElement.dureeProperty()); 
      } 
    } 

但它不工作(甚至沒有編譯)。我想說的是:「將這個簡單的屬性綁定到這個複雜的對象,並調用我通過名爲」createElapsedBindingByBindingsAPI2(..)「的方法給出的方法。這就是窮人.... 任何幫助,請:)

+0

Rela特德問題(以不同的解決方案的方法,但可能有所幫助):http://stackoverflow.com/questions/34506662/javafx-combobox-binding – Itai

+0

有人建議手動編寫實現更改監聽器的綁定。我以高級別綁定的方式指望JavaFX的強大功能。代碼越少越好! –

回答

0

的例子,(顯然)與遺留代碼風格(Swing的編碼)的作品:。

duree.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<DureeChoiceBoxElement>() { 

      @Override 
      public void changed(ObservableValue<? extends DureeChoiceBoxElement> observable, 
        DureeChoiceBoxElement oldValue, DureeChoiceBoxElement newValue) { 
       // changement durée 
       log.debug("Durée sélectionnée : {}", duree.getSelectionModel().getSelectedItem().getDuree()); 
       log.debug("Durée bindée ? : {}", pel.getDuree()); 
       pel.setDuree(duree.getSelectionModel().getSelectedItem().getDuree()); 

      } 
     }); 

像這樣我的模型設置爲選定的項目,但它暗示了一些樣板代碼。基於JavaFX的高級綁定的更好的想法?

+0

但在其他的方式,高水平的綁定工作(從模型 - >組合框):duree.valueProperty() \t \t \t \t .bind(createElapsedBindingByBindingsAPI(新DureeChoiceBoxElement(pel.getDuree()的intValue())) ); –