我在试着练习装订。我想做一个有两个微调器的窗口,让它们显示相同的值。
问题是绑定不可靠:如果单击过快,微调器似乎会停止彼此更新。两个微调器仍然对单击做出响应,并且在被单击的微调器上正确地计算单击次数,但是另一个微调器停止更新并且从不恢复。它不需要非常快的点击就可以产生。
我的代码是基于这个答案(目前评分为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);
}
暂无答案!
目前还没有任何答案,快来回答吧!