遇到的问题:
在JPanel里面添加的组件一直会存在,组件的值会随着传入值的变化而变化,但不需要组建时,组件删除不掉。
有读音文件时需要显示发音按钮
无读音文件时不需要发音按钮,但JPanel并不会更新组件
解决办法:
1、每次需要绘制框体时,先删掉组件再更新
if (e.getSource() == laccount) {
pcenter.removeAll();
pcenter.repaint();
pcenter.add(Account.setAccount());
pcenter.revalidate();
}
最终得到了想要的结果,组件被清空,并且完成了自己的重绘功能
对于这个问题我的理解是:先用removeAll()移除了所有组件,但是并未刷新,所以单使用这个方法虽然内部组件确实改变了,但是界面显示不变;repaint()相当于刷新了整个面板,所以用了remover All()之后面板是空的,如果不先使用removeAll()那么接下来添加的组件会接在之前存在的组件后面(因为之前的组件未移除);然后在添加新的组件后使用revalidate(),重新对面板计算大小并且对面板中的组件进行布局,这样就把新添加的组件添加进去了。对于revalidate() JDK里面是这样说的:使用 validate 方法会使容器再次布置其子组件。已经显示容器后,在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。我觉得这里应该有一个刷新作用,添加了组件后必须刷新面板才能再次显示出来。
总结:先移除组件( removeAll() ),然后重绘面板( repaint() ),再添加组件( add() ),最后重新布局面板( revalidate() )。
引用自:https://blog.csdn.net/baidu_41267789/article/details/80784823
2、每次都将组件重新new一下,也可以解决更新问题
3、再需要变动时手动remove掉
if(word.getPronunciation() != null){
File MP3File = new File(word.getPronunciation());//获得MP3文件
if(MP3File.exists()){
Style pronunciation = doc.addStyle("pronunciation", def);
JButton pronunciationButton = new JButton("发音");// 创建按钮
StyleConstants.setComponent(pronunciation, pronunciationButton);// 将按钮增加到文本窗格中
}else{
doc.removeStyle("pronunciation");//如果文件不存在,则删掉按钮组件
}
}else{
doc.removeStyle("pronunciation");//如果路径为空,则删掉按钮组件
}