我在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());
答案 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
方法中将它们捆绑在一起,同时将解除逻辑添加到同一位置。注意:这可以进一步概括。