我使用JavaFX NumberBindings来计算某些值。一开始一切正常,但是在很短的时间内,绑定就突然停止工作了。我也没有收到异常。
我尝试了几种绑定方法和高级、低级的方法。甚至覆盖计算本身也会突然停止,不再被调用。我也已经更新到最新的JDK(1.8.0_05),重新构建/重启了所有内容。
以下是最小化的工作示例,说明了问题所在。它应该向STDOUT输出主窗口的当前宽度。调整窗口大小约10秒后,输出就会停止。我还尝试将结果属性绑定到JavaFX控件,以确保属性的持续使用,但都无济于事。我相信我在这里缺少一些非常基本的Property/Bindings行为,Google似乎根本不知道这种行为。
import javafx.application.Application;
import javafx.beans.binding.NumberBinding;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class BindingsProblem extends Application {
@Override
public void start(Stage primaryStage) {
// Initialization...
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
// Binding - The problem occurrs here!
NumberBinding currentWidthPlusTen = primaryStage.widthProperty().add(10);
IntegerProperty boundNumberProperty = new SimpleIntegerProperty();
boundNumberProperty.bind(currentWidthPlusTen);
boundNumberProperty.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
System.out.println(newValue.toString());
}
});
}
public static void main(String[] args) {
launch(args);
}
}
boundNumberProperty
变量并直接将监听器添加到currentWidthPlusTen
来简化。问题仍然存在,但解决方案仍然有效。 - bruno