[英]JavaFX: Binding a TextProperty (eg. Label) to a simple Integer
一般问题:当简单整数的值发生变化时,有没有办法更新标签?
我说的是简单的int而不是像ReadOnlyIntegerWrappers这样的东西。 我根据在javafx中将Converting Integer转换为ObservableValue <Integer> (我不得不将ObservableValue的标识符(就是所谓的名称?)从Integer更改为String来尝试以下内容,因为我找不到将它绑定到的方法否则为TextProperty)
我已经在下面包含了我的演示代码,它似乎在label.textProperty().bind(m.getObsValue());
导致了NullPointerException。bind label.textProperty().bind(m.getObsValue());
。 该应用程序是以MVC模式编写的。
模型:
public class Model {
private int value;
private ObservableValue<String> obsInt;
public Model(){
value = 5;
obsInt = new ReadOnlyObjectWrapper<>(value + "");
}
public int getValue(){
return value;
}
public void setValue(int value){
this.value = value;
}
public ObservableValue<String> getObsValue(){
return obsInt;
}
}
控制器:
public class Controller {
private Model m;
private View v;
public Controller(Model m, View v){
this.m = m;
this.v = v;
}
public void handleMouseclick(MouseEvent e){
m.setValue(m.getValue() + 5);
}
public void init(){
v.setOnMouseClicked(this::handleMouseclick);
}
}
视图:
public class View extends Region{
private Model m;
private Label label;
public View(Model m)
{
this.m = m;
label.textProperty().bind(m.getObsValue());
label.setLayoutX(200);
label.setLayoutY(200);
paint();
}
public void paint(){
getChildren().clear();
getChildren().addAll(label);
}
@Override
public double computePrefHeight(double width){
return 800;
}
@Override
public double computePrefWidth(double height){
return 600;
}
}
您可能已经注意到我目前仍在学习JavaFX。 所以我可能只是错过了一些愚蠢的东西。 任何建议将不胜感激 !
让我们从最后开始 - 例外是因为你永远不会初始化label
,所以它是null - 就这么简单。 使用label = new Label();
应该解决它。
现在对于绑定 - 你说你不想使用IntegerProperty
或ReadOnlyIntegerWrapper
,而是使用一个简单的int
- 这意味着你没有方便的方法来知道值何时被改变! 标签将始终包含整数的初始值,因此您可以执行以下操作:
label.setText(Integer.toString(m.getValue()));
相反,我建议你做一些类似的事情
public class Model {
private SimpleIntegerProperty value = new SimpleIntegerProperty(this, "value");
public Model() {
value.set(5);
}
public int getValue(){
return value.get();
}
public void setValue(int value){
this.value.set(value);
}
public IntegerProperty valueProperty(){
return value;
}
}
然后你可以使用Bindings.convert
标签的text属性:
label.textProperty().bind(Bindings.convert(m.valueProperty()));
这样,只要模型的值发生变化,标签文本就会自动反映出来。
正如您所看到的, SimpleIntegerProperty
无需担心! 构造函数中的参数是可选的,但建议 - 它们是此属性所属的对象( this
),以及属性的名称(在本例中为"value"
)。 您还可以在构造函数中传递初始值,而不是在Model
构造函数中显式设置它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.