(JavaFX)绑定textProperty()时无法使用控件?

时间:2016-09-09 01:58:42

标签: java javafx data-binding

我刚刚开始学习属性绑定。我有我的控件设置和绑定的属性(代码缩写):

@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本身目前是空的。

基本上,我只希望TextFieldoldPremium字符串始终保持同步。但我仍然需要能够对文本TextField进行处理。我还有其他几种类型的控件(CheckBoxComboBox等),我希望与基础数据同步。

1 个答案:

答案 0 :(得分:0)

您正在将文本字段的文本属性绑定到已创建的没有初始值的StringProperty个实例。所以,例如,当你做

private SimpleStringProperty oldPremium = new SimpleStringProperty();

您创建的oldPremium没有实际值。因此oldPremium.getValue()将返回null

那么当你做的时候

txtOldPremium.textProperty().bindBidirectional(oldPremium);

您同步两个属性(txtOldPremium.textProperty()oldPremium)的状态,这涉及将oldPremiumnull)的值复制到{{1} }。

所以只需初始化属性以保存空字符串,而不是null:

txtOldPremium.textProperty()

另外,请注意,在此特定示例中,您可以实现相同的功能而无需复制所有属性。即你可以做到

private SimpleStringProperty oldPremium = new SimpleStringProperty("");

您仍然可以定义属性访问器方法

private StringProperty oldPremium ;

// ...

@FXML
public void initialize() {

    // ...

    oldPremium = txtOldPremium.textProperty();

    // ...

}

正如你可能已经拥有的那样,它将具有完全相同的效果,但开销更少。

双向绑定对于同步属于两个不同对象的属性(例如属于不同控制器的属性,或控制器和模型)非常有用。也许你的问题减少了代码以证明问题,但我想我会指出其他用户。