【发布时间】:2011-11-23 19:44:53
【问题描述】:
我目前有一个发送 HTTP 请求的 SwingWorker,我重写了 SwingWorker 的 done() 方法来更改 JFrame 中的内容。我想基本上删除所有内容并根据从服务器返回的值在 JFrame 上添加一个新成员面板。
现在,我面临的问题是,当我在 JFrame 上调用以下方法时,它不会从 JFrame 中删除任何内容,也不会更改其包含在 Frame 中的内容。
//TODO: Investigate why JFrame content pane won't repaint.
f.removeAll();
//Pass the frame f reference only into MainDisplay, it doesn't actually do anything apart from allowing a class to add a JMenuBar on the JFrame.
f.add(new MainDisplay(f));
f.getContentPane().invalidate();
f.getContentPane().validate();
f.getContentPane().repaint();
我目前的修复如下,但我宁愿更改 JFrame 的内容,而不是加载一个新的。
f.dispose();
f=new ApplicationFrame();
我在此处和 Google 上查看了以前的答案,并且某些状态使用 validate() 或 invalidate() 同时调用 repaint() 来重绘 JFrame。
任何建议/帮助将不胜感激。
编辑:我想我会进行更多调试,因为肯定还有其他问题。
【问题讨论】:
-
有谁知道使用 remove 或 removeAll 是否会删除框架上的面板/面板的实际内存?还是只是将其从框架中删除?
-
它只是从框架中删除组件。由 JVM 垃圾收集器来“删除”内存……或者更确切地说,释放内存。 GC 不保证这会在程序的生命周期内发生。此外,如果被删除的组件在程序的其他地方被引用,那么它们将不会被 GC(除非在特殊情况下使用弱引用)。