我在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多显示一会,但就会有这个图片显示的延迟问题。向大家请教解决办法。

解决方案 »

  1.   

    首先我对 SWT 知道的就是一点点,所以我也不清楚;
    但是你可以试一试:
             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("拼写正确!太棒了!!");
    你可试一试 这个方法;
      

  2.   

    这是因为你Thread.sleep操作把AWT的界面刷新线程阻塞住了,直到结束睡眠后,才调用界面刷新线程,让图片刷新导致的。我个人建议你改变一下设计思路,不是去控制它显示多少时间,而是去控制它多少时间后自动隐藏掉(即setVisible(false)或者setImage(null)之类的操作)。
    这样就可以用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();
    }
    }
    });
      

  3.   

    啊,我这个是Swing的 - -
    SWT里也有类似的一个线程调度类,是Display.getDefault().syncExec( new Runnable(){} );//里面一样
      

  4.   

    尝试试用一下MediaTracker
    里面有一个方法waitforall还是什么的,可以用来做图片同步
      

  5.   

    MediaTracker是swing的,对swt有效吗?
      

  6.   

    看看Display类中的
    public void timerExec(int milliseconds,Runnable runnable)
    public void asyncExec(Runnable runnable)
    public void syncExec(Runnable runnable)