javafx - 如何在 JavaFx 中使用 Wea​​kChangeListener?

标签 javafx weak-references changelistener

我基于 TableCell 编写了我的 TableCell 实现。我正在使用 ChangeListener,但它不是垃圾收集。在这种情况下如何使用 Wea​​kChangeListener。请看我的代码。如何将其切换为 WeakChangeListener。

    changeListener = new ChangeListener<Object[]>() {

        @Override
        public void changed(ObservableValue<? extends Object[]> observable, Object[] oldValue, Object[] newValue) {
            if (newValue != null && oldValue != null) {
                if (oldValue[21].equals(newValue[21])) {
                    if (newValue[updateBasedValues] != null) {
                        if (!newValue[updateBasedValues].equals(oldValue[updateBasedValues])) {
                            justUpdated = true;
                        }
                    }
                }
            }
        }

    };        
    itemProperty().addListener(changeListener);

最佳答案

您需要保留对弱监听器的引用,以免它很快被垃圾回收。 在 oracle 论坛上阅读这个非常好的讨论:https://community.oracle.com/thread/2396063

我已经编写了一个适配器类“WeakAdapter”,您可以使用或扩展它。 关于如何使用此类的示例: 而不是写作

myBooleanProperty.addListener(new ChangeListener<Boolean> () {...});

使用:

weak = new WeakAdapter();
weak.addChangeListener(myBooleanProperty, new ChangeListener<Boolean> (){});

这是 WeakAdapter 类的代码:

public class WeakAdapter {

    ArrayList<Object> listenerRefs = new ArrayList<>();

    public WeakAdapter() {
    }

    public void dipose() {
        listenerRefs.clear();
    }

    public final <T> void remove(ChangeListener<T> listener) {
        listenerRefs.remove(listener);
    }

    public final <T> void addChangeListener(final ObservableValue observable, ChangeListener<T> listener) {
        listenerRefs.add(listener);
        observable.addListener(new WeakChangeListener<>(listener));
    }

    public final <T> WeakListChangeListener<T> addListChangeListener(ListChangeListener<T> listener) {
        listenerRefs.add(listener);
        return new WeakListChangeListener<>(listener);
    }

    public void addInvalidationListener(final Observable listened, InvalidationListener listener) {
        listenerRefs.add(listener);
        listened.addListener(new WeakInvalidationListener(listener));
    }

    public final void stringBind(final StringProperty propertyToUpdate, final StringExpression expressionToListen) {
        ChangeListener<String> listener = new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> ov, String t, String name) {
                propertyToUpdate.set(name);
            }
        };
        listenerRefs.add(listener);
        expressionToListen.addListener(new WeakChangeListener<>(listener));
        listener.changed(null, null, expressionToListen.get());
    }

    public final void booleanBind(final BooleanProperty propertyToUpdate, final BooleanExpression expressionToListen) {
        ChangeListener<Boolean> listener = new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean name) {
                propertyToUpdate.set(name);
            }
        };
        listenerRefs.add(listener);
        expressionToListen.addListener(new WeakChangeListener<>(listener));
        propertyToUpdate.set(expressionToListen.get());
    }
}

关于javafx - 如何在 JavaFx 中使用 Wea​​kChangeListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22798158/

相关文章:

java - 如何触发 JSlider 更改监听器?

Java ChangeListener 多次触发

JavaFX 事件处理程序与更改监听器术语

java - 如果e(jx)clipse插件不起作用怎么办?

java - 如何在javafx中打开新阶段时退出primaryStage

java - 时间轴动画JavaFX

Java:强/软/弱/幻引用之间的区别

java - 具有透明 ScrollPane 的透明舞台不透明

c# - 对象完成但尚未收集垃圾时的弱引用行为

c# - 弱引用已死