java JPanel里面加入的组件动态更新

遇到的问题:

在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");//如果路径为空,则删掉按钮组件
        }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值