在Object和SimpleIntegerProperty之间绑定

时间:2016-11-29 15:39:18

标签: binding javafx-2

我在JavaFX中的GUI上有一个组合框。 此组合框由复杂类型元素组成:

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());
            }
    }

但它不起作用(甚至不编译)。我想说“将这个简单属性绑定到这个复杂的Object,调用我通过名为”createElapsedBindingByBindingsAPI2(..)“的方法给你的方法。 这是合乎逻辑的阅读,但无论如何我都没有成功。 那很差...... 任何帮助请:)。

1 个答案:

答案 0 :(得分: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的高级绑定有更好的想法吗?