1. 最近在用java swing做界面程序,通过在jframe里面add不同的jpanel来实现界面的切换。实现的方法是frame.removeAll(); frame.add(new subpanel()); 做的时候在想这样之前remove掉的panel的内存是不是释放掉了。于是,打开任务管理器发现,随着不断地切换界面,内存占用在不断增加。然后就到网上查看,发现有人也有这样的疑问,但是有一条回答说虚拟机的垃圾回收会在一段时间之后回收不用的资源。过了一会,又打开任务管理器发现内存果然变小了。第一次见识到gc的威力,也消除了我一个疑问。
随后在国外的网站上查了一些资料,对jpanel有了更深的了解。
2. Q:为什么jpanel不需要dispose()方法而jdialog需要
A:因为jdialog有一个本地的“映射”(native peer),某个与本地操作系统相关的窗口控件。而这个peer是在虚拟机之外的所以垃圾回收无法对它奏效,我们必须自己来。而jpanel就没有本地“映射”了,只要把它的引用设为null就可以实现自动回收。
详见:http://www.coderanch.com/t/341023/GUI/java/destroying-JPanel
3. Q:如何把一个jpanel上面的所有控件设置为统一的字体(注意,因为jpanel上面可能还有数层jpanel,所以需要递归)。
A:public static final void setJPanelFont(JPanel aPanel, Font font)
{
Component c = null;
Component[] components = aPanel.getComponents();
aPanel.setFont(font);
if(components != null)
{
int numComponents = components.length;
for(int i = 0; i < numComponents; i++)
{
c = components[i];
if(c != null)
{
if(c instanceof JPanel)
setJPanelFont((JPanel)c,font);
else
c.setFont(font);
}
}
}
}