当前位置: 首页 > 面试题库 >

JavaFX Beans绑定突然停止工作

曹德明
2023-03-14
问题内容

我使用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 我不知道为什么我什么都没做就发生了这件事。我应该如何解决此错误?