我在swt中,在一个线程里动态的加载图片,代码如下: boolean case = true;
if(case){
label_img.setImage(new Image(label_img.getDisplay(), "img/smile.png"));
label_row.setText("拼写正确!太棒了!!");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }else {
label_row.setText("拼写错误……再来一次!!");
label_img.setImage(new Image(label_img.getDisplay(), "img/cold.png"));
}在第一个if里,label_row立刻就能显示出来,但label_img要延迟一会才会显示;但在else里,label_row和label_img同时就显示出来了。另外,注释掉Thread那几句也就不延迟了。我想用Thread来让label_row和label_img多显示一会,但就会有这个图片显示的延迟问题。向大家请教解决办法。
if(case){
label_img.setImage(new Image(label_img.getDisplay(), "img/smile.png"));
label_row.setText("拼写正确!太棒了!!");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }else {
label_row.setText("拼写错误……再来一次!!");
label_img.setImage(new Image(label_img.getDisplay(), "img/cold.png"));
}在第一个if里,label_row立刻就能显示出来,但label_img要延迟一会才会显示;但在else里,label_row和label_img同时就显示出来了。另外,注释掉Thread那几句也就不延迟了。我想用Thread来让label_row和label_img多显示一会,但就会有这个图片显示的延迟问题。向大家请教解决办法。
但是你可以试一试:
1. 首先把 图片文件加载到内存中, Image imageSrc = new Image(diaplay,"img/smile.png");
接下来再使用改图象label_img.setImage(imageSrc);
2.label_img.setImage(new Image(label_img.getDisplay(), "img/smile.png"));
-->>这个地方加一句 label_img.getDisplay().update();//这个是刷新组件
label_row.setText("拼写正确!太棒了!!");
你可试一试 这个方法;
这样就可以用Timer进行控制了,会比用Thread的sleep减少很多麻烦。如果不改变原思路的话,还有一种不是很好的解决方案可以避免这种问题,但是我强烈不推荐这样做。代码如下://使用SwingUtilities强制让Thread的sleep操作排在图像显示完毕之后再进行。
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
label_img.setImage(new Image(label_img.getDisplay(), "img/smile.png"));
label_row.setText("拼写正确!太棒了!!");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
SWT里也有类似的一个线程调度类,是Display.getDefault().syncExec( new Runnable(){} );//里面一样
里面有一个方法waitforall还是什么的,可以用来做图片同步
public void timerExec(int milliseconds,Runnable runnable)
public void asyncExec(Runnable runnable)
public void syncExec(Runnable runnable)