我刚刚开始学习属性绑定。我有我的控件设置和绑定的属性(代码缩写):
@FXML
private TextField txtOldPremium;
@FXML
private TextField txtNewPremium;
@FXML
private TextField txtProratedChange;
private SimpleBooleanProperty quoteOnly = new SimpleBooleanProperty();
private SimpleBooleanProperty reviewedBilling = new SimpleBooleanProperty();
private SimpleStringProperty oldPremium = new SimpleStringProperty();
private SimpleStringProperty newPremium = new SimpleStringProperty();
private SimpleStringProperty proratedChange = new SimpleStringProperty();
private SimpleStringProperty additionalInformation = new SimpleStringProperty();
@FXML
public void initialize() {
// Bind the vehicle data to the tableview
colEffectiveDate.setCellValueFactory(new PropertyValueFactory<Vehicle, String>("effectiveDateString"));
colDescription.setCellValueFactory(new PropertyValueFactory<Vehicle, String>("description"));
colVIN.setCellValueFactory(new PropertyValueFactory<Vehicle, String>("vin"));
colAction.setCellValueFactory(new PropertyValueFactory<Vehicle, String>("action"));
// Setup data binding to controls
chkQuoteOnly.selectedProperty().bindBidirectional(quoteOnly);
chkReviewedBilling.selectedProperty().bindBidirectional(reviewedBilling);
txtOldPremium.textProperty().bindBidirectional(oldPremium);
txtNewPremium.textProperty().bindBidirectional(newPremium);
}
@Override
public String getComments() {
StringBuilder comments = new StringBuilder();
if (!txtOldPremium.getText().isEmpty() && !txtNewPremium.getText().isEmpty()) {
} else {
}
}
if (!txtProratedChange.getText().isEmpty()) {
}
我在if (!txtOldPremium.getText().isEmpty() && !txtNewPremium.getText().isEmpty()) {
收到NullPointerException。我假设我正在做一些完全错误的实现绑定。 TextFields本身目前是空的。
基本上,我只希望TextField
和oldPremium
字符串始终保持同步。但我仍然需要能够对文本TextField
进行处理。我还有其他几种类型的控件(CheckBox
,ComboBox
等),我希望与基础数据同步。
答案 0 :(得分:0)
您正在将文本字段的文本属性绑定到已创建的没有初始值的StringProperty
个实例。所以,例如,当你做
private SimpleStringProperty oldPremium = new SimpleStringProperty();
您创建的oldPremium
没有实际值。因此oldPremium.getValue()
将返回null
。
那么当你做的时候
txtOldPremium.textProperty().bindBidirectional(oldPremium);
您同步两个属性(txtOldPremium.textProperty()
和oldPremium
)的状态,这涉及将oldPremium
(null
)的值复制到{{1} }。
所以只需初始化属性以保存空字符串,而不是null:
txtOldPremium.textProperty()
等
另外,请注意,在此特定示例中,您可以实现相同的功能而无需复制所有属性。即你可以做到
private SimpleStringProperty oldPremium = new SimpleStringProperty("");
您仍然可以定义属性访问器方法
private StringProperty oldPremium ;
// ...
@FXML
public void initialize() {
// ...
oldPremium = txtOldPremium.textProperty();
// ...
}
正如你可能已经拥有的那样,它将具有完全相同的效果,但开销更少。
双向绑定对于同步属于两个不同对象的属性(例如属于不同控制器的属性,或控制器和模型)非常有用。也许你的问题减少了代码以证明问题,但我想我会指出其他用户。