我使用JavaFX NumberBindings来计算某些值。最初,一切正常。但是,经过相当短的时间后,绑定将停止工作。我也没有收到例外。
我已经尝试了几种绑定以及高级和低级方法。即使计算本身(被覆盖时)也只是停止并且不再被调用。我还更新到了最新的JDK(1.8.0_05),并重新构建/重新启动了所有内容。
以下最小工作示例说明了该问题。它应该将System.out.println主窗口的当前宽度设置为STDOUT。调整窗口大小约10秒钟后,输出仅停止。我还尝试将结果属性绑定到JavaFX控件,以确保继续使用该属性,但这没有用。我相信这里缺少属性/绑定的一些非常基本的行为,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);
}
}
绑定使用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如何解决它。
我有一个稍微令人困惑的问题,我认为由于一个愚蠢的疏忽,这将是一个容易解决的问题。 我的主要任务是上传图像和录音文件到我的服务器上的一个位置。我通过FTP这样做。 活动通过startService(intentName)调用服务 onHandleIntent()创建一个新线程 在新线程中,需要上传的文件被放入一个列表数组 在列表数组中循环。在这个循环中,将文件名传递给FTP服务器。如果添加成功,我会
问题内容: 我们的Jenkins构建开始在一夜之间因错误而失败: Jenkins服务器仍在运行Java 6,但我们没有做任何更改。 发生了什么,我们如何解决? 问题答案: 该詹金斯-声纳插件使用声纳Maven的插件来运行声纳分析。 Sonar-maven-plugin已于2015-10-19更新至2.7,新版本与Java 6不兼容。 Jenkins-sonar-plugin默认使用最新版本的son
我们的Jenkins构建在一夜之间开始失败,错误如下: Jenkins服务器仍然运行Java6,但我们没有改变任何东西。 发生了什么,我们如何解决?
我的Visual Studio Code有问题。昨天我在打开VS Code的情况下关闭了我的电脑,当我再次打开电脑时,所有VS Code扩展都停止了工作。我在项目中使用React和Types cript,我真的需要这些扩展。我的eslint和漂亮的配置也停止了工作。如果有人有同样的问题,请回答。
我一直在使用一个异步任务,通过REST API将数据从应用程序发送或提取到数据库,反之亦然。我在我的几个项目(已完成)中使用的代码也是我在其他新项目中使用的代码。我现在创建了一个新项目,工作的异步代码不再取数据了,但是我在以前的项目中粘贴的相同代码,它工作得很好。我有一个新的项目明天开始,我希望我易于使用的代码在新的项目中也能很好地工作。被认为是在清单中添加了INTERNET权限。mainacti
当设计视图突然停止工作时,我的android studio工作得很好。所谓设计视图,我指的是XML设计的UI预览。我收到一条消息说 Android N要求IDE以Java1.8或更高版本运行。安装支持的JDK 我不知道为什么我什么都没做就发生了这件事。我应该如何解决此错误?