将双值绑定到JavaFXGUI

将双值绑定到JavaFXGUI,java,javafx,data-binding,bind,keyframe,Java,Javafx,Data Binding,Bind,Keyframe,我已经为我的学校项目(调谐器)实现了fft,尽管我无法将计算出的频率传递给GUI。我试过绑定,关键帧,我似乎无法掌握它,我对java真的很陌生 public class FrequencyBean { double freq; private SimpleDoubleProperty value = new SimpleDoubleProperty(this, "value"); public void setValue(double value){ this.value.

我已经为我的学校项目(调谐器)实现了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());
}
公共类控制器实现可初始化{
频率bean fbean;
@FXML
自有品牌otherFq;
@FXML
私密文本频率;
@FXML
私人文本;
@FXML
私有矩形6;
@FXML
私有文本格式;
@FXML
私有矩形中心\ U矩形;
@FXML
私有矩形1;
@FXML
私有矩形2;
@FXML
私有矩形3;
@FXML
私有矩形4;
@FXML
私有矩形5;
@FXML
私人文本中心;
@FXML
私有矩形平板6;
@FXML
私有矩形平板5;
@FXML
私有矩形平板4;
@FXML
私有矩形平板3;
@FXML
私有矩形平面2;
@FXML
私有矩形平面1;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
fbean=新的FrequencyBean();
otherFq=新标签();
频率=新文本();
布尔停止=假;
InputThread input=新的InputThread();
中的任务=新任务(){
@凌驾
受保护的Void调用()引发异常{
input.run();
返回null;
}
};
螺纹th0=新螺纹(英寸);
th0.start();
frequency.textProperty().bind(fbean.getDoublePropertyValue());
}

将FrequencyBean正确重写为“JavaFXBean”:

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"));
请注意,如果需要单向绑定,这是正确的。
还有一种双向绑定方法。

永远不要初始化用
@FXML
注释的字段(
@FXML
的要点是它们将由
fxmloader
创建)。在这里,您创建一个新的
文本
对象,将其分配给
频率
,并且从不显示它,因此无论您如何更改其
文本
,结果都将不可见。删除
频率=新文本()
@James\D谢谢你的回复。虽然我得到的只是一堆不知从哪里冒出来的FXML错误,但我已经解决了。无论如何,你能不能提供有关DoubleProperty如何工作的信息?它现在似乎工作正常,但当我将
double
分配给
DoubleProperty
的set方法时,它被卡住了。对不起,我真的不明白你问的是什么?你说“卡住”是什么意思?我在某些点上设置了sysout,当我的代码调用带有
double
参数的方法时,该参数将其分配给
DoubleProperty
,它停止并不执行以下代码。我使用了并发,并在
Task
中进行了扩展,因此我的gui正常,但代码隐藏被停止。它引发了一个异常,因为更改属性会导致UI通过绑定更新,而您无法从后台线程更新UI。(在任务上设置
onFailed
处理程序,并在其中执行
task.getException().printStackTrace()
以查看…)谢谢你的回答,不管怎样,我已经用Fproperty作为可观察值解决了这个问题,在以后的初始化中使用ChangeListener。它是有效的,但是如果有任何理由(比如说,内存或其他)对一般的侦听器使用绑定,我会很高兴继续我的教育。存在的理由绑定的代码更少:我们不需要添加listner,绑定“嵌入”listner。