Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFXBeans绑定突然停止工作_Java_Binding_Properties_Javafx_Javabeans - Fatal编程技术网

JavaFXBeans绑定突然停止工作

JavaFXBeans绑定突然停止工作,java,binding,properties,javafx,javabeans,Java,Binding,Properties,Javafx,Javabeans,我使用JavaFXNumberBindings来计算某些值。最初一切都按预期进行。然而,在相当短的时间之后,绑定就停止了工作。我也没有收到任何例外 我尝试了几种绑定,以及高级和低级方法。甚至计算本身(被重写时)也会停止,不再调用。我还更新了最新的JDK(1.8.0_05),并重建/重新启动了所有内容 下面的示例说明了这个问题。它应该将System.out.println主窗口的当前宽度设置为标准输出。调整窗口大小约10秒后,输出即停止。我还尝试将生成的属性绑定到JavaFX控件,以确保该属性的持

我使用JavaFXNumberBindings来计算某些值。最初一切都按预期进行。然而,在相当短的时间之后,绑定就停止了工作。我也没有收到任何例外

我尝试了几种绑定,以及高级和低级方法。甚至计算本身(被重写时)也会停止,不再调用。我还更新了最新的JDK(1.8.0_05),并重建/重新启动了所有内容

下面的示例说明了这个问题。它应该将System.out.println主窗口的当前宽度设置为标准输出。调整窗口大小约10秒后,输出即停止。我还尝试将生成的属性绑定到JavaFX控件,以确保该属性的持续使用,但这是徒劳的。我相信我在这里遗漏了一些非常基本的属性/绑定行为,谷歌似乎根本不知道这些行为

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);
}

}
导入javafx.application.application;
导入javafx.beans.binding.NumberBinding;
导入javafx.beans.property.IntegerProperty;
导入javafx.beans.property.SimpleIntegerProperty;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共类绑定问题扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
//初始化。。。
StackPane root=新的StackPane();
场景=新场景(根,300,250);
初级阶段。场景(场景);
primaryStage.show();
//绑定-问题发生在这里!
NumberBinding currentWidthPlusTen=primaryStage.widthProperty().add(10);
IntegerProperty boundNumberProperty=新的SimpleIntegerProperty();
boundNumberProperty.bind(currentWidthPlusTen);
boundNumberProperty.addListener(新的ChangeListener(){
@凌驾
public void changed(observeValue绑定使用a来观察
currentWidthPlusTen
的值。由于您没有保留对
boundNumberProperty
的引用,因此只要
启动(…)它就有资格进行垃圾收集
方法退出。当垃圾收集器启动时,引用将完全丢失,绑定将不再工作

要直接看到这一点,请添加行

root.setOnMousePressed( event -> System.gc());
转到
start(…)
方法。您可以通过单击窗口强制侦听器“停止工作”

显然,这不是您想要的:修复方法是在
start(…)
退出后保留对
boundNumberProperty
的引用。例如:

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);
    }

}
导入javafx.application.application;
导入javafx.beans.binding.NumberBinding;
导入javafx.beans.property.IntegerProperty;
导入javafx.beans.property.SimpleIntegerProperty;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共类绑定问题扩展了应用程序{
整数属性boundNumberProperty;
@凌驾
公共无效开始(阶段primaryStage){
//初始化。。。
StackPane root=新的StackPane();
场景=新场景(根,300,250);
初级阶段。场景(场景);
primaryStage.show();
//绑定-问题发生在这里!
NumberBinding currentWidthPlusTen=primaryStage.widthProperty()
.添加(10);
boundNumberProperty=新的SimpleIntegerProperty();
boundNumberProperty.bind(currentWidthPlusTen);
boundNumberProperty.addListener(新的ChangeListener(){
@凌驾

更改公众假期(我可以重现这个问题。它看起来像一个bug。你搜索过jira吗?我似乎找不到现有的bug报告。它似乎很基本,很难想象它是JDK/JRE本身的一个bug。很好!这解决了我的问题。我倾向于相信并依赖Java中的自动内存/引用管理。显然,它不是太多了:有趣的是,在大多数情况下,除了示例代码中的简单测试类型之外,实际使用它进行任何操作时,问题都会消失。例如,如果创建一个标签并将其文本绑定到
IntegerProperty
,那么标签当然会有效地保留对属性的引用,因此它不会得到垃圾collected。在真实场景中偶尔会出现这个问题,但非常罕见。这个问题让我发疯,因为我在2.x中工作的大量代码现在“神秘地”停止工作。希望人们至少能够控制使用
弱侦听器的时间。。。