绑定使用WeakListener来观察的值
currentWidthPlusTen。由于您没有保留对的引用
boundNumberProperty,因此只要
start(...)方法退出,就可以进行垃圾回收。当垃圾收集器启动时,引用将完全丢失,并且绑定不再起作用。
要直接查看此内容,请添加以下行
root.setonMousePressed( event -> System.gc());
的
start(...)方法。您可以通过单击窗口来强制侦听器“停止工作”。
显然,这不是您想要的:解决方法是保留退出
boundNumberProperty后的引用
start(...)。例如:
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 { IntegerProperty boundNumberProperty; @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); 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); }}更新资料
任何遇到此问题的人都可能想看看Tomas
Mikula的ReactFX,它为此提供了一种更清洁的解决方法(以使用第三方库为代价,您需要花一些时间来学习)。Tomas在此博客和后续文章中解释了此问题以及ReactFX如何解决它。



