【问题标题】:How to use WeakChangeListener with JavaFx?如何在 JavaFx 中使用 Wea​​kChangeListener?
【发布时间】:2014-04-01 22:27:39
【问题描述】:

我基于 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);

【问题讨论】:

  • 这两个对象的面向公众的 API 似乎几乎相同。您确定简单的查找和替换不够吗?
  • 查找和替换是什么意思,我试图在 finalize 函数中删除监听器,它对我不起作用? ://

标签: javafx weak-references changelistener


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2020-01-30
    相关资源
    最近更新 更多