2016-11-29 82 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())) ); –