一般问题:当简单整数的值发生变化时,有没有办法更新标签?
我说的是简单的int而不是像ReadOnlyIntegerWrappers这样的东西.我根据在javafx中将Converting Integer转换为ObservableValue
我在下面包含了我的演示代码,其中似乎导致了NullPointerException label.textProperty().bind(m.getObsValue());
.该应用程序是以MVC模式编写的.
模型:
public class Model { private int value; private ObservableValueobsInt; public Model(){ value = 5; obsInt = new ReadOnlyObjectWrapper<>(value + ""); } public int getValue(){ return value; } public void setValue(int value){ this.value = value; } public ObservableValue 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
.