如何解决set() 方法在 JavaFX 属性中不起作用
最近我创建了一个 JavaFX
应用程序来演示 properties
。
- 首先,我创建了一个名为“Numbers”的类。这是代码。
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;
}
}
- 然后,在我的
controller class
中,我为“Numbers”类创建了一个对象。
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)
的方法set()
或property
方法。请有人帮我澄清这个场景。
附注:
- 我遵循了 YouTube 教程,他创建了这个确切的应用程序。他制作了这些方法和实例
final
,我不知道为什么。我只是试图模仿他的一段代码。有人请在这里解释final
关键字的重要性。 - 我可以确认我也通过 Scene Builder 成功配置了方法
btnPlusClicked(ActionEvent event)
。
解决方法
您正在观看的教程是对 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;
}
注意上面的代码和你的代码之间的两个区别:
-
上面设置了
number
字段,然后返回该字段的值。您目前每次都返回一个 new
SimpleDoubleProperty
并且从不存储它。这意味着您无法观察它的变化,因为每当您设置属性时都会更改不同的实例。 -
该方法的名称是
numberProperty
。这遵循 JavaFX 属性的命名约定,即:如果您有一个名为
foo
的属性,则 getter 应命名为getFoo()
,setter(如果可写)应命名为 {{1} },并且属性 getter 应命名为setFoo(...)
。请注意,setter 应该只有一个参数,其类型与存储在属性中的值类型相匹配。 -
奖励:我设置了
fooProperty()
的“bean”和“name”。这并不是让您的代码正常工作所必需的,而是“正确”的做法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。