首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清除javafx.scene.Scene$MouseHandler中的集合?

如何清除javafx.scene.Scene$MouseHandler中的集合?
EN

Stack Overflow用户
提问于 2018-12-05 20:11:22
回答 1查看 142关注 0票数 1

我有2 Pane。第一个窗格是主菜单,它的Rectangle中只有children。第二个窗格是我的游戏。当我转到主菜单时,我使用以下方法清除游戏窗格

代码语言:javascript
复制
//Fighting fighting = new Fighting();
//There is Pane fighting in fighting
if(fighting != null) {
    fighting.getFighting().getChildren().clear();
    fighting = null;
    System.gc();
}

当我scene.setRoot(fighting.getFighting());和不做任何事情时(不要在有OnMouse...()的对象上悬停,不要调用移动播放器的方法)并退出到主菜单(单击Esc)

代码语言:javascript
复制
scene.setOnKeyPressed(event -> {
    if (event.getCode()==KeyCode.ENTER) setFighting();
    if (event.getCode()==KeyCode.ESCAPE) setMainMenu();
});

在这种情况下,我没有内存问题,GC删除无用的对象。

但是,如果我单击/悬停在任何具有listeners move() 的对象上,或者在player上调用move(),GC将不会删除同一个对象。

在我的分析器中,我发现这些无用对象上的引用存储在Pane中,这是ArrayListScene中的匿名类MouseHandler中的一个。不能添加图像好。

另外,我发现堆中只有2个Pane。其中一个是mainMenu。我理解它,因为它的Rectangle中只有children。第二个窗格的子元素等于children.size() == 0

这是Scene & MouseHandler的代码

代码语言:javascript
复制
private MouseHandler mouseHandler;

class MouseHandler {

   /* lists needed for enter/exit events generation */
    private final List<EventTarget> pdrEventTargets = new ArrayList<EventTarget>();
    private final List<EventTarget> currentEventTargets = new ArrayList<EventTarget>();
    private final List<EventTarget> newEventTargets = new ArrayList<EventTarget>();

    private final List<EventTarget> fullPDRCurrentEventTargets = new ArrayList<EventTarget>();
    private final List<EventTarget> fullPDRNewEventTargets = new ArrayList<EventTarget>();
    private EventTarget fullPDRCurrentTarget = null;

}

是否可以清除这些集合或修复内存泄漏?谢谢你的回答

EN

回答 1

Stack Overflow用户

发布于 2019-01-27 16:28:46

从技术上讲,您可以使用反射API访问该列表并手动清除它,但我不确定这样做是否安全。

pdrEventTargets列表保存的组件链表示从场景到最后单击的组件的路径,并且该列表在每次单击时都会被刷新。因此,如果您已经替换了组件树的一个分支,但仍然看到列表中删除的组件上有一堆引用,那么在下一次MouseHandler单击处理时,这些引用将从MouseHandler中删除。至少在我使用JDK1.8进行调试时,它的行为与此完全相同。您可能有完全相同的行为,所以应该没有理由担心,至少如果这些陈旧的组件不包含对某些“重”对象的引用,而这些对象在这些组件被移除后不应该存在。在这种情况下,您应该删除该引用,作为组件删除过程的一部分。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53640001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档