【问题标题】:Binding double value to JavaFX gui将双精度值绑定到 JavaFX gui
【发布时间】:2017-03-09 14:07:28
【问题描述】:

我已经为我的学校项目(调谐器)实施了 fft,但我无法将计算出的频率传递给 GUI。我尝试了绑定,关键帧,我似乎无法掌握它,我对 java 真的很陌生。

public class FrequencyBean {

double freq;
private SimpleDoubleProperty value = new SimpleDoubleProperty(this, "value");


public void setValue(double value){
        this.value.set(value);
        System.out.println(value+" set");
    }
public DoubleProperty getDoublePropertyValue(){
    System.out.println("gotvals");
    return value;
}
public FrequencyBean(){
    freq = 10.0;
}

这是我的控制器的一部分,我也被推荐使用称为紧密绑定的东西,这将是这个类的抽象。这对我的代码有好处吗?

这是我的主控制器:

public class Controller implements Initializable{

FrequencyBean fbean;

@FXML
private Label otherFq;

@FXML
private Text frequency;

@FXML
private Text sharpFq;

@FXML
private Rectangle sharp6;

@FXML
private Text flatFq;

@FXML
private Rectangle center_rectangle;

@FXML
private Rectangle sharp1;

@FXML
private Rectangle sharp2;

@FXML
private Rectangle sharp3;

@FXML
private Rectangle sharp4;

@FXML
private Rectangle sharp5;

@FXML
private Text centerFq;

@FXML
private Rectangle flat6;

@FXML
private Rectangle flat5;

@FXML
private Rectangle flat4;

@FXML
private Rectangle flat3;

@FXML
private Rectangle flat2;

@FXML
private Rectangle flat1;

@Override
public void initialize(URL location, ResourceBundle resources) {

    fbean = new FrequencyBean();
    otherFq = new Label();
    frequency = new Text();
    boolean stop = false;
    InputThread input =  new InputThread();
         Task<Void> in = new Task<Void>() {

            @Override
            protected Void call() throws Exception {

                input.run();

                return null;

                }
            };
        Thread th0 = new Thread(in);
        th0.start();


        frequency.textProperty().bind(fbean.getDoublePropertyValue());
}

【问题讨论】:

  • 永远不要初始化带有@FXML 注释的字段(@FXML 的全部意义在于它们将由FXMLLoader 创建)。在这里,您创建一个新的Text 对象,将其分配给frequency,并且从不显示它,因此无论您如何更改其text,结果都将永远不可见。删除frequency = new Text()。
  • @James_D 感谢您的回复。虽然我得到的只是一堆不知从何而来的 FXML 错误,但我已经解决了这个问题。无论如何,您能否提供有关 DoubleProperty 如何工作的信息?现在似乎可以正常工作,但是当我将 double 分配给 DoubleProperty 的 set 方法时卡住了。
  • 对不起,我不太明白你在问什么。 “卡住”是什么意思?
  • 我已经在某些点上设置了 sysouts,当我的代码到达带有 double 参数的方法调用时,它将它分配给 DoubleProperty 它停止并且不执行以下代码。我使用了并发,这是在Task中扩展的,所以我的gui没问题,但是后面的代码被停止了。
  • 它抛出异常,因为更改属性会导致 UI 通过您的绑定更新,并且您无法从后台线程更新 UI。 (在您的任务上设置一个onFailed 处理程序并在其中执行task.getException().printStackTrace() 以查看...)

标签: java javafx data-binding bind keyframe


【解决方案1】:

将您的 FrequencyBean 正确地重写为“JavaFX-Bean”:

public class FrequencyBean {

   private SimpleDoubleProperty frequency = new SimpleDoubleProperty();

   /**
   * @param frequency the frequency to set
   */
   public void setFrequency(double value){
        this.frequency.set(value);
   }

   /**
   * @return the frequency as double 
   */
   public double getFrequency(){
        return this.frequency.get();
   }

   /**
   * @return the frequency property
   */
   public DoubleProperty frequencyProperty(){
      return value;
   }
   public FrequencyBean(){
      frequency = 10.0;
   }
}

正如 Jame_D 指出的那样:不要初始化带有 @FXML 注释的控件。 只需像这样绑定有问题的控件:

...
@FXML 
TextField tf_Frequency;
...

fbean = new FrequencyBean(20.3);
tfFrequency.textProperty().bind(fbean.frequencyProperty().asString("%.2f"));

请注意,如果您需要单向绑定,这是正确的。 还有一个 bindBidirectional 方法。

【讨论】:

  • 感谢您的回答,无论如何我已经解决了这个问题,将 fPropetry 用作可观察值,稍后在初始化中使用 ChangeListener。它可以工作,但如果有任何理由(比如记忆或其他原因)对一般听众使用绑定,我会很高兴继续我的教育。
  • 绑定的“存在理由”是更少的代码:我们不需要添加监听器,绑定“嵌入”一个监听器。
猜你喜欢
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2010-12-08
  • 2016-07-15
相关资源
最近更新 更多