set() 方法在 JavaFX 属性中不起作用
set() method doesn't work in JavaFX properties
最近我创建了一个 JavaFX
应用程序来演示 properties
。
- 首先我创建了一个名为 '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;
}
}
- 然后,在我的
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.:
- 我遵循了 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
字段,然后returns该字段的值。
您目前每次都返回 new SimpleDoubleProperty
并且从不存储它。这意味着您无法观察它的变化,因为每当您设置 属性.
时都会更改不同的实例
方法名称是numberProperty
.
遵循 JavaFX 属性的命名约定,即:如果您有一个名为 foo
的 属性,则 getter 应命名为 getFoo()
,setter(如果可写)应命名为 setFoo(...)
,属性 getter 应命名为 fooProperty()
。请注意 setter 应该只有一个参数,其类型与存储在 属性.
中的值类型相匹配
奖励: 我设置了 SimpleDoubleProperty
.
的“bean”和“名称”
这并不是使您的代码正常工作所必需的,但却是“正确”的做法。
最近我创建了一个 JavaFX
应用程序来演示 properties
。
- 首先我创建了一个名为 '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;
}
}
- 然后,在我的
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.:
- 我遵循了 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
字段,然后returns该字段的值。您目前每次都返回 new
时都会更改不同的实例SimpleDoubleProperty
并且从不存储它。这意味着您无法观察它的变化,因为每当您设置 属性.方法名称是
numberProperty
.遵循 JavaFX 属性的命名约定,即:如果您有一个名为
中的值类型相匹配foo
的 属性,则 getter 应命名为getFoo()
,setter(如果可写)应命名为setFoo(...)
,属性 getter 应命名为fooProperty()
。请注意 setter 应该只有一个参数,其类型与存储在 属性.奖励: 我设置了
的“bean”和“名称”SimpleDoubleProperty
.这并不是使您的代码正常工作所必需的,但却是“正确”的做法。