JavaFX:使用绑定成员重置对象

时间:2017-02-08 09:47:50

标签: java javafx binding

我在JavaFX中有一个绑定成员的对象,我希望在某个时刻将成员重置为初始状态。

所以我的第一个选择是逐个重置它们,这是很多代码,但它的工作正常。

另一种选择是重新实例化myModel = new Model(),但是如果对象引用发生了变化,我就失去了绑定。

有没有其他方法可以实现这个目标?

修改

模型

public class Service extends BaseModel {
    private StringProperty serviceType = new SimpleStringProperty();
    private ObjectProperty<BigDecimal> buyingPrice = new SimpleObjectProperty<>(new BigDecimal(0));
    private ObjectProperty<BigDecimal> sellingPrice = new SimpleObjectProperty<>(new BigDecimal(0));

    public Service(){

    }

    public String getServiceType() {
        return bundle.getString("service");
    }

    public StringProperty serviceTypeProperty() {
        return serviceType;
    }

    public void setServiceType(String serviceType) {
        this.serviceType.set(serviceType);
    }

    public BigDecimal getBuyingPrice() {
        return buyingPrice.get();
    }

    public ObjectProperty<BigDecimal> buyingPriceProperty() {
        return buyingPrice;
    }

    public void setBuyingPrice(BigDecimal buyingPrice) {
        this.buyingPrice.set(buyingPrice);
    }

    public BigDecimal getSellingPrice() {
        return sellingPrice.get();
    }

    public ObjectProperty<BigDecimal> sellingPriceProperty() {
        return sellingPrice;
    }

    public void setSellingPrice(BigDecimal sellingPrice) {
        this.sellingPrice.set(sellingPrice);
    }
}

绑定:

public class ServiceForm extends HBox implements Initializable {
    private Service service = new Service();

    @FXML
    private TextField serviceDescriptionField;

    @FXML
    private TextField servicePriceField;

    @FXML
    private Button addButton;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        serviceDescriptionField.textProperty().bindBidirectional(service.descriptionProperty());

        servicePriceField.textProperty().bindBidirectional(service.sellingPriceProperty(), new BigDecimalStringConverter());
    }

    public Service getService() {
        return service;
    }

    public void setService(Service service) {
        this.service = service;
    }

    public Button getAddButton() {
        return addButton;
    }

    public void setAddButton(Button addButton) {
        this.addButton = addButton;
    }
}

这样做并不能清除我的字段,我相信它会破坏我的约束力:

serviceForm.setService(new Service());

1 个答案:

答案 0 :(得分:1)

您可以尝试将Service作为属性:

private ObjectProperty<Service> service = new SimpleObjectProperty<>(new Service());

将绑定解压缩为私有方法,该方法可以取消绑定旧绑定并创建新绑定:

private void createBindings(Service oldService) {
    // Unbind if there is an older service
    if (oldService != null) {
        servicePriceField.textProperty().unbindBidirectional(oldService.sellingPriceProperty());
        serviceDescriptionField.textProperty().unbindBidirectional(oldService.descriptionProperty());
    }

    servicePriceField.textProperty().bindBidirectional(service.get().sellingPriceProperty(), new BigDecimalStringConverter());
    serviceDescriptionField.textProperty().bindBidirectional(service.descriptionProperty());
}

然后在initialize方法中:

createBindings(null);
service.addListener((obs, oldval, newval) -> createBindings(oldval));

这样,如果您拨打service.set(new Service()),系统会为新Service创建绑定,并会删除之前的绑定。

现在,当您添加新绑定时,可以在createBindings方法中将它们捆绑在一起,同时将解除逻辑添加到同一位置。注意:这可以进一步概括。