set() 方法在 JavaFX 属性中不起作用

set() method doesn't work in JavaFX properties

最近我创建了一个 JavaFX 应用程序来演示 properties

  1. 首先我创建了一个名为 'Numbers' 的 class。这是代码。
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;

public class Numbers {

    private DoubleProperty number;

    public final double getNumber() {
        if (number != null)
            return number.get();
        return 0;
    }

    public final void setNumber(double number) {
        this.getDoubleProperty().set(number);
    }

    public final DoubleProperty getDoubleProperty(){
        if(number == null)
            return new SimpleDoubleProperty(0);
        return number;
    }
}
  1. 然后,在我的 controller class 中,我为 'Numbers' class 创建了一个对象。
final Numbers num1 = new Numbers();

其余代码如下。

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {

    final Numbers num1 = new Numbers();

    @FXML
    private Label lblValue;

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

        num1.setNumber(0.5d);

        num1.getDoubleProperty().addListener(new ChangeListener<Object>() {
            @Override
            public void changed(ObservableValue<? extends Object> observableValue, Object oldValue, Object newValue) {
                lblValue.setText(Double.toString(num1.getNumber()));
            }
        });

    }

    public void btnPlusClicked(ActionEvent event){
        num1.setNumber(num1.getNumber() + 1);
    }

但是,当点击相关按钮时,Label 'lblValue' 的文本不会改变。我做了一些编辑,发现问题不在于 Action Listener。我认为问题出在方法 btnPlusClicked(ActionEvent event)property 的方法 set() 上。请有人帮助我澄清这种情况。

P.S.:

您正在观看的教程正在使用 JavaFX 属性的“惰性模式”。也就是说, 属性 对象本身在写入或直接查询之前不会被创建。但是在执行过程中出现了错误。不知道是教程弄错了,还是你只是复制代码的时候弄错了,不过 属性 getter 应该是这样的:

public final DoubleProperty numberProperty() {
  if (number == null) {
    // this constructor sets the initial value to 0.0
    number = new SimpleDoubleProperty(this, "number");
  }
  return number;
}

请注意上述代码与您的代码之间的两个区别:

  1. 上面设置了number字段,然后returns该字段的值。

    您目前每次都返回 new SimpleDoubleProperty 并且从不存储它。这意味着您无法观察它的变化,因为每当您设置 属性.

    时都会更改不同的实例
  2. 方法名称是numberProperty.

    遵循 JavaFX 属性的命名约定,即:如果您有一个名为 foo 的 属性,则 getter 应命名为 getFoo(),setter(如果可写)应命名为 setFoo(...),属性 getter 应命名为 fooProperty()。请注意 setter 应该只有一个参数,其类型与存储在 属性.

    中的值类型相匹配
  3. 奖励: 我设置了 SimpleDoubleProperty.

    的“bean”和“名称”

    这并不是使您的代码正常工作所必需的,但却是“正确”的做法。