JavaFX-双向绑定要么不工作,要么停止工作

JavaFX-双向绑定要么不工作,要么停止工作,java,javafx,properties,binding,Java,Javafx,Properties,Binding,我在做一个数独游戏项目。我有代表81个框的javafx按钮,存储在boardButtons列表和userBoard中,我认为这是我的另一个类的对象,现在不重要了。方法getField返回存储此数独字段值的对象字段。我想使用双向绑定,它需要像这样,这样当我选择一个框并输入一些值时,它不仅显示在这个框中,而且还保存在userBoard的字段中,反之亦然。 当我运行应用程序时,在框中输入一些值后,它们将停止保存到userBoard的字段中。有时它发生在刚开始的时候,有时我设法输入一些数字。我已经在网上

我在做一个数独游戏项目。我有代表81个框的javafx按钮,存储在boardButtons列表和userBoard中,我认为这是我的另一个类的对象,现在不重要了。方法getField返回存储此数独字段值的对象字段。我想使用双向绑定,它需要像这样,这样当我选择一个框并输入一些值时,它不仅显示在这个框中,而且还保存在userBoard的字段中,反之亦然。 当我运行应用程序时,在框中输入一些值后,它们将停止保存到userBoard的字段中。有时它发生在刚开始的时候,有时我设法输入一些数字。我已经在网上搜索了解决方案,但我不知道为什么会发生这种情况

StringConverter converter = new IntegerStringConverter();

    boardButtons.forEach((button) -> {
        try {
            index = boardButtons.indexOf(button);
            IntegerProperty fieldValueProperty = new JavaBeanIntegerPropertyBuilder()
                    .bean(userBoard.getField(index))
                    .name("fieldValue").build();

            button.textProperty().bindBidirectional(fieldValueProperty, converter);

            fieldValueProperty.addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
                    if (gameStarted) {
                        System.out.println("fieldValueProperty changed: " + fieldValueProperty);
                    }
                }
            });
        } catch (NoSuchMethodException ex) {
            ex.printStackTrace();
        }
    });

虽然没有足够的信息提供适当的解决方案,但我可以解释为什么双向绑定最终会停止工作

TL;DR:您的fieldValueProperty正在被垃圾收集

JavaFX的核心库试图尽可能地防止内存泄漏。这通常涉及在侦听器/绑定的实现中使用弱引用。此外,双向绑定的当前实现是通过第三个后台类完成的,您无权访问该类。这个幕后类只维护对绑定中涉及的两个属性的弱引用。这可以防止一个属性将另一个属性保存在内存中,这一点很重要,因为与单向绑定不同,如果只引用其中一个属性,则无法撤消双向绑定

基本上,这是一种冗长的说法,表示您没有维护对fieldValueProperty的强引用,因此它可能在某个时候被垃圾收集。你可能认为:

fieldValueProperty.addListenernew ChangeListener{ @凌驾
public void changedobservablevalue为什么不使用定向绑定?按钮的文本永远不会更改,因此除了您没有发布的代码之外,您应该可以使用。请改为绑定。@TagHoward我没有提供所有信息-它需要是双向的,因为还需要修改按钮文本,而不是从直接输入,而是从sto红色用户板-例如重置数独和做一些其他事情。所以我想坚持双向绑定。如果你把它们都放到数组中,这将非常困难。我认为这将帮助你发布问题Java bean属性只会触发更改,如果你通过属性对象做任何修改。任何直接访问beans方法无法观察到,因此您基本上创建了一个绑定,该绑定只在一个方向有效工作;直接对fieldValue属性所做的更改不会触发属性对象的任何更新。要更改此方法,您需要以某种方式使fieldValue属性可见,这是使用简单的IntegerProperty…这就是我要找的。非常感谢