我基于 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);
最佳答案
您需要保留对弱监听器的引用,以免它很快被垃圾回收。 在 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 中使用 WeakChangeListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22798158/