当前位置:  开发笔记 > 编程语言 > 正文

JavaFX:将TextProperty(例如Label)绑定到一个简单的Integer

如何解决《JavaFX:将TextProperty(例如Label)绑定到一个简单的Integer》经验,为你挑选了1个好方法。

一般问题:当简单整数的值发生变化时,有没有办法更新标签?

我说的是简单的int而不是像ReadOnlyIntegerWrappers这样的东西.我根据在javafx中将Converting Integer转换为ObservableValue (我不得不将ObservableValue的标识符(就是所谓的名称?)从Integer更改为String 来尝试以下内容,因为我找不到将其绑定到的方法否则为TextProperty)

我在下面包含了我的演示代码,其中似乎导致了NullPointerException label.textProperty().bind(m.getObsValue());.该应用程序是以MVC模式编写的.

模型:

public class Model {

private int value;
private ObservableValue obsInt;

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.所以我可能只是错过了一些愚蠢的东西.任何建议将不胜感激 !



1> Itai..:

让我们从最后开始 - 例外是因为你从不初始化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.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有