今天在写课程设计,要求是做一个思维导图编辑工具,对节点进行操作之后要实现动态变化。因为节点组成的组件过多,遍历删除很耗费时间,所以直接用removeAll后重新遍历添加。
然而在这时候发现removeAll之后添加新组件无法添加成功,导致页面不能刷新。
下面直接贴原来的代码:
public void refresh(){
frame.removeAll();
show();
frame.repaint();
}
之后又尝试了一些其他办法,比如添加frame.revalidate();等等,都无法解决问题。
最后发现是因为removeAll会把JFrame的根面板(Root Pane)删除,而JFrame 的根面板(Root Pane)是一个包含内容面板的面板,它提供了一些额外的功能,比如处理窗口的装饰和事件分发。其中ContentPane是Root Pane的一个JPanel或类似的容器子组件,它用于放置实际的用户界面内容,负责布局和管理用户界面的其他组件,当它被删除就会导致页面其他组件失效。
所以removeAll的正确用法应该为:getContentPane().removeAll();
于是我把代码修改了一下就成功了:
public void refresh(){
frame.getContentPane().removeAll();
show();
frame.repaint();
}

被折叠的 条评论
为什么被折叠?



