如何在JavaFx中使用WeakChangeListener?

时间:2014-04-01 22:27:39

标签: javafx weak-references changelistener

我基于TableCell编写了我的TableCell实现。我使用的是ChangeListener,但它不是垃圾回收。在这种情况下如何使用WeakChangeListener。请看我的代码。如何将其切换到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);

1 个答案:

答案 0 :(得分:2)

您需要保留对弱侦听器的引用,以便不会过早收集垃圾。 在oracle论坛上阅读这个非常好的讨论:https://community.oracle.com/thread/2396063

我写了一个适配器类&#34; WeakAdapter&#34;你可以使用或扩展。 关于如何使用此类的示例: 而不是写

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

使用:

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

以下是WeakAdapter类的代码:     公共类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());
    }
}