如何在Java中从JFrame中删除所有组件?

33

我正在编写一个程序,其中有一个JFrame,我想从中删除所有组件,然后只添加一个组件并重绘框架。到目前为止,我已经拥有了类似下面代码的东西(在实现JFrame的对象中调用,其中StartPanel实现了JPanel):

removeAll();    
startPanel = new StartPanel();
startPanel.setVisible(true);
add(startPanel);
revalidate();
repaint();

然而,当我运行代码时,它显示一个空白窗口(而非 startPanel),并且当我最小化/调整窗口大小时,窗口会变成黑色。如果我省略 removeAll() 并且 JFrame 上没有任何元素,则它可以正常显示 startPanel。有没有办法真正删除所有内容,然后仍然显示新面板?


1
一个词:CardLayout - Hovercraft Full Of Eels
@HovercraftFullOfEels 那可能行得通,但是有没有其他手动的方法呢?为什么 removeAll() 没有像我想象中的那样工作?如果在代码的其他部分中我需要有一些不同组件的组合(不仅仅是一个同时显示),那我就不想要 CardLayout 了。 - scaevity
3个回答

59

你必须调用

 private JFrame frame = new JFrame();
 ...
 ...
 frame.getContentPane().removeAll();
 frame.repaint();

removeAll()没有像add()remove()一样被重写,以便根据需要转发到contentPane


@scae:Kavka似乎比我们其他人更敏锐。很好的发现,点赞加一。 - Hovercraft Full Of Eels
感谢您简明扼要且有帮助的回答。像您所描述的那样,removeAll() 确实应该像 add()remove() 一样被重写。这只是 Java 中另一个奇怪的怪癖... - Variadicism
1
调用revalidate()可能也是必要的,就像原问题中所示,但不在这个答案中。如果您稍后向JFrame添加其他内容,则需要调用revalidate()。我知道这不是原始问题,但我认为这是一个足够常见的用例,在这里记录一下。因为这是我的用例,并且我在Google搜索中找到了这个问题/答案。 - Jason

6
假设您的目标是在清除帧后添加其他内容,您应该在添加这些组件后调用 validate 以更新它。
getContentPane().removeAll();
add(new component);
validate();

5
getContentPane().removeAll();
getContentPane().repaint();

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