我在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(..)“的方法给你的方法。 这是合乎逻辑的阅读,但无论如何我都没有成功。 那很差...... 任何帮助请:)。
答案 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的高级绑定有更好的想法吗?