两个双向绑定的javafx整数微调器:为什么绑定不可靠?

ccgok5k5  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(202)

我在试着练习装订。我想做一个有两个微调器的窗口,让它们显示相同的值。
问题是绑定不可靠:如果单击过快,微调器似乎会停止彼此更新。两个微调器仍然对单击做出响应,并且在被单击的微调器上正确地计算单击次数,但是另一个微调器停止更新并且从不恢复。它不需要非常快的点击就可以产生。
我的代码是基于这个答案(目前评分为8分)的,它显示了如何将微调器绑定到integerproperty。这个答案足以产生我正在挣扎的行为,但我遵循了这个答案下的简短讨论。它还显示了其他选项和链接的资源,包括使用.asobject()的提示和强引用。
我使用的是oraclejdk1.8.0\u251,只是因为我无法让javafx在我尝试过的其他jdk下运行。如果有关系的话,我现在正在使用linux上的eclipse 2019-12。而且,微调器在调试模式下根本不会互相更新,但是如果我运行代码,它们就可以工作(首先)。
为什么会这样?我的猜测是:
我还在忍受垃圾收集的痛苦
有些东西跟不上快速点击:我的笔记本电脑的硬件,linux操作系统,eclipse,我的jdk,javafx?
我能保护我的代码不受此影响吗?我是否可以限制单击,使微调器单击仅在其速度足够慢以保持绑定时才对单击作出React?
请让我知道,如果行为描述是不清楚的,我会上传一个屏幕记录到youtube或其他东西。

public class BindTwoSpinners extends Application {

@Override
public void start(Stage primaryStage) throws IOException {

    // Set up the topSpinner
    Spinner<Integer> topSpinner = new Spinner<Integer> (1,12,1);
    topSpinner.setEditable(true);
    ObjectProperty<Integer> topObjectProp = new SimpleObjectProperty<>(1);
    IntegerProperty topIntegerProperty = IntegerProperty.integerProperty(topObjectProp);
    topSpinner.getValueFactory().valueProperty().bindBidirectional(topObjectProp);

    // Set up the bottomSpinner
    Spinner<Integer> bottomSpinner = new Spinner<Integer> (1,12,1);
    bottomSpinner.setEditable(true);
    ObjectProperty<Integer> bottomObjectProp = new SimpleObjectProperty<>(1);
    IntegerProperty bottomIntegerProperty = IntegerProperty.integerProperty(bottomObjectProp);
    bottomSpinner.getValueFactory().valueProperty().bindBidirectional(bottomObjectProp);         

    // Need to keep the reference as bidirectional binding uses weak references
    // https://docs.oracle.com/javase/8/javafx/api/javafx/beans/property/IntegerProperty.html
    ObjectProperty<Integer> topIntegerPropertyAsObject = topIntegerProperty.asObject();
    ObjectProperty<Integer> bottomIntegerPropertyAsObject = bottomIntegerProperty.asObject();

    // Bind the two spinners
    bottomSpinner.getValueFactory().valueProperty(). bindBidirectional(topIntegerPropertyAsObject);

    VBox root = new VBox(10, topSpinner, bottomSpinner);
    root.setAlignment(Pos.CENTER);
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
}

public static void main(String[] args) {
    launch(args);
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题