awt panel 重画问题

Achilles_Dynasty 2010-04-14 10:42:45
两面三个panel。
toolpanel。previewpanel,mainpanel、
mainpanel采用gridlayout布局,toolpanel里有一个choice组件。previewpanel里准备动态添加几个panel,用来显示图像。
我已经对choice控件进行了监听,在监听函数里写下如下代码:
public void choice_itemStateChanged(ItemEvent e) {
String strChoice = choice.getSelectedItem();//可能值“1”,“4”,“16”
int iCur = -1;
if(strChoice==null && "".equals(strChoice)){
return ;
}
else{
iCur = Integer.parseInt(strChoice);
if(iCur<0 || iCur > iMaxWindow){
System.out.println("选择窗口错误");
return ;
}
iCurWindow = iCur;
double dCur = iCurWindow;
dCur = Math.sqrt(dCur);
System.out.println("求平方根后:" + dCur);
previewPanel.removeAll();
int iSqrt = (int)dCur;
previewPanel.setLayout(new GridLayout(iSqrt,iSqrt,3,3)); //重新布局
for(int i=0; i<iCur ; i++){
panelArray[i].setVisible(true);
previewPanel.add(panelArray[i]);
}//添加panel
startPreview(); //这个函数,不用管。
}

}

问题就是,当我根据下拉框选择不同的值是,previewPanel里显然是已经添加入了新的panel,但是此时不显示,或以原来的panel布局显示。必须鼠标拖动窗口,或改变窗口大小才能得到新布局后的图像。这样是不满足我要求的。我觉得的是重画的问题,于是在函数末尾加入了repaint()函数,仍然没有效果。大家不知道可否提出些好方法。
...全文
86 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Achilles_Dynasty 2010-04-14
  • 打赏
  • 举报
回复
自己解决了。最末尾加上getParent().validate();
上面的panel是放在一个applet里的。对于重量级组件,applet自己是从来不显式地表示无效的。
此时只有调用调用applet中的validate()强迫布置applet。
* The <code>validate</code> method is used to cause a container
* to lay out its subcomponents again. It should be invoked when
* this container's subcomponents are modified (added to or
* removed from the container, or layout-related information
* changed) after the container has been displayed.
结贴。
Achilles_Dynasty 2010-04-14
  • 打赏
  • 举报
回复
所以我现在关注的问题就是,动态添加的panel的注销问题。
内存不是问题,主要就是CUP利用率的问题。
我想来想去,
在 iCur = Integer.parseInt(strChoice)后,添加一段代码,如下,发现也没什么效果:
	if(panelArray!=null){
System.out.println("开始销毁panelArray******************");
for(int ilength=0; ilength <panelArray.length; ilength++){
System.out.println("销毁name : " + panelArray[ilength]);
panelArray[ilength] = null; //强制垃圾回收,想要销毁panel的句柄。
}
}

但是发现还是没有效果。
Achilles_Dynasty 2010-04-14
  • 打赏
  • 举报
回复
反正要结贴,大家讨论讨论。有没有答案无所谓,技术交流了。还是上面的代码,想讨论的就是下这句话。如下:
1.
previewPanel.removeAll();


原来以为调用了code1,会移除容器里的所有panel,同时销毁。但发现结果不是那么回事。
比如我选择了16画面的选项,资源管理器显示CPU就上去了。按常理,选择了1画面后,CPU应该就会下来,但发现CPU利用率还是很高。后来接了一段代码,打印panel。
在startPriview()加入一段代码:
			Component[] com = previewPanel.getComponents();			
System.out.println("开始打印控件信息******************选择" + iCur + "画面的情况");
for(Component cop : com){
System.out.println("Component name is :" + cop.getName());
}

打印结果很奇妙。如下:
开始打印控件信息******************选择1画面的情况
Component name is :panel0
开始打印控件信息******************选择4画面的情况
Component name is :panel1
Component name is :panel2
Component name is :panel3
Component name is :panel4
开始打印控件信息******************选择9画面的情况
Component name is :panel5
Component name is :panel6
Component name is :panel7
Component name is :panel8
Component name is :panel9
Component name is :panel10
Component name is :panel11
Component name is :panel12
Component name is :panel13


这不是我期待的结果,期待结果是每一次选择后,Companent的name都是从0开始,而不是持续添加。
Achilles_Dynasty 2010-04-14
  • 打赏
  • 举报
回复
发帖前研究了好久,刚刚发不一会,谁知道就突然解决了,晕倒,呵呵。过会多来几个朋友,把分分了算了。[Quote=引用 2 楼 zfq642773391 的回复:]

楼主不错 自己高分发了一贴 20分钟后自己解决了 呵呵
我也干过这事,刚开始问题自己怎么都解决不了 ,就赶紧发帖,可发完贴后仔细研究下,问题就解决了
碰到问题还是要自己好好钻研下,不能一遇到问题就问,这样不利于能力的提高 呵呵
[/Quote]
zfq642773391 2010-04-14
  • 打赏
  • 举报
回复
楼主不错 自己高分发了一贴 20分钟后自己解决了 呵呵
我也干过这事,刚开始问题自己怎么都解决不了 ,就赶紧发帖,可发完贴后仔细研究下,问题就解决了
碰到问题还是要自己好好钻研下,不能一遇到问题就问,这样不利于能力的提高 呵呵

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧