当从JFrame中移除面板后,如何处理JPanel。

3

我创建了2个JPanel,它们将被添加到一个JFrame中。
首先,其中一个JPanel被添加到了JFrame中。
我使用了JFrame的“add()”方法来添加JPanel。

JPanel panel = new JPanel();
JFrame j = new JFrame();
j.getContentPane().add(panel);

JFrame 上设置了 JMenuBar,其中添加了 2 个 JMenuItem 到一个 JMenu 中,最后将 JMenu 添加到 JMenuBar。
当点击第一个 JMenuItem 时,会从 JFrame 中移除先前的面板并将其他 JPanel 添加到 JFrame 中。 第二个 JMenuItem 则相反,移除先前的 JPanel 并放置较新的 JPanel。

JMenuItem a = new JMenuItem("p1");
a.addActionListener(new...
{
Frame2 ob = new Frame2();//another class which adds components on the panel.
JPanel p1 = ob.getPanel();//method used to return the JPanel from another class
j.getContentPane().remove(0);
j.getContentPane().add(p1);
});


JMenuItem b = new JMenuItem("p2");
a.addActionListener(new...
{
Frame3 ob2 = new Frame3();//another class which adds components on the panel.
JPanel p2 = ob2.getPanel();//method used to return the JPanel from another class
j.getContentPane().remove(0);
j.getContentPane().add(p2);
});

我现在面临的问题是,当面板被移除时,它们没有被销毁,并且在内存中某个地方占用内存。
尽管之前的面板不可见,新面板可以看到,但是之前的面板(不可见的面板)占用的内存可以在任务管理器中看到。
并且随着我在面板之间切换,它们所占用的内存会不断增加,因为每次都会创建一个新的面板实例。
我想在移除面板时将它们销毁,但是像JFrame的dispose()方法一样,没有一种销毁JPanel的方法。


你尝试过使用 setVisible(false) 吗? - khachik
我不想隐藏面板,我想在用户从菜单栏中点击其他面板(如菜单项p2)后删除该面板。 - Jaguar
2个回答

1

JFrame 是窗口,JPanel 是容器。当 JPanel 实例失去引用时,它将被垃圾回收。


1)JFrame也是一个容器。 2)没错,但据我了解,当从框架中移除时,JPanel并不会失去其引用。 - khachik
它应该被垃圾回收,但实际上没有。我认为remove()方法并没有让它失去引用,而只是隐藏了面板。 - Jaguar
@Jaguar 如果它是垃圾回收的,你就不能再添加了。因此,你不需要它被垃圾回收(或者我没有理解你的问题)。 - khachik
1
我不想销毁框架,我只想在用户从菜单栏中选择另一个选项时销毁面板。 - Jaguar

1

看上面的代码,似乎缺少了一步。 "remove()" 将从内容窗格中移除引用,但如果面板变量未设置为 null 或超出作用域,则面板仍将具有引用,并且不会被垃圾回收。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接