如何在JPopMenu.show之后释放项目?

时间:2016-07-27 16:20:10

标签: java swing garbage-collection visualvm jpopupmenu

我正在尝试追踪为什么我的对象MyData没有被垃圾收集,我看到的一个问题是JPopupMenu,其中包含几个包含对MyData实例的引用的Actions,尚未收集(由VisualVM验证。

应该如何/何时清除?

我有这个:

private void mousePressEventFired(MouseEvent e) {
   JPopupMenu popup = new JPopupMenu();
   controller.customizePopupForObject(popup,null,null,
                       selectedNode.getUserObject());
   popup.show(e.getComponent(),e.getX(),e.getY());
}

我从这个样本中删除了我为调用customizePopupForObject所做的工作。 customizePopupForObject包含许多看起来像这样的行:

popup.add(new MyDataAction1(myData,this,false));

我在OSX上使用Java 1.7.0_79。我开始将弹出项目中的所有引用设置为WeakReferences,但我不确定它是如何工作的。

我尝试添加这个:

                 popup.addPopupMenuListener(new PopupMenuListener() {

                    @Override
                    public void popupMenuWillBecomeVisible(
                          PopupMenuEvent e) {
                    }

                    @Override
                    public void popupMenuWillBecomeInvisible(
                          PopupMenuEvent e) {
                       ((JPopupMenu) e.getSource()).removeAll();
                    }

                    @Override
                    public void popupMenuCanceled(PopupMenuEvent e) {
                    }
                 });

但这似乎不是正确的方法。

稍微相关......即使我不想删除我的数据,弹出窗口对我来说也有点奇怪。如果我在项目不同的地方触发它,我可以看到它在视觉上闪烁 - 第一个图像是弹出窗口,然后它会更新到它应该是什么。

0 个答案:

没有答案