为什么匿名内部类不会在这里发布,导致内存泄漏? FX 2.2.1会发生这种情况。
anchorPane.getParent().getParent().lookup("#grandParentButton").addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
if (e.getCode() == KeyCode.ENTER) {
someButtonInsideAnchorPane.requestFocus();
e.consume();
}
}
});
另一方面,为什么这会被垃圾收集?
button1InsideAnchorPane.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
if (e.getCode() == KeyCode.ENTER) {
button2InsideAnchorPane.requestFocus();
e.consume();
}
}
});
答案 0 :(得分:1)
内部类总是对其外部类保持强引用,并且如果外部类不再被引用则仅被引入。使它成为一个静态的内部类,你没有问题!
答案 1 :(得分:1)
第一个答案是错误的。确实,“一个内在的阶级总是对其外部阶级持有强烈的反对”,但事实却是如此。实际上,只要内在存在,就无法收集外层。
实例未被收集为注册为侦听器的原因。注册商通常对听众有强烈的引用,因此无法收集实例(不知道FX)。
对于不同行为的唯一解释是每个对象都使用不同的组件注册。其中一个已经收集而另一个没有收集。不知道为什么,也许其中一个属于对话?