2014-09-19 75 views
2

嗯,我试图与一个一点点动画for循环和代码是下一个:我怎样才能让循环在每圈之间等待1秒?

private class Listen4 implements ActionListener{ 
    int i ; 
    for (i = 0; i<5 ; i++){ 
      try{ 
        if (i == 0){ imglabel.setIcon(new ImageIcon("1.png")); } 
        if (i == 1){ imglabel.setIcon(new ImageIcon("2.png")); } 
        if (i == 2){ imglabel.setIcon(new ImageIcon("1.png")); } 
        if (i == 3){ imglabel.setIcon(new ImageIcon("2.png")); } 
        if (i == 4){ imglabel.setIcon(new ImageIcon("1.png")); } 
        Thread.sleep(1000); 
      } 
      catch (InterruptedException e){} 
    } 
} 

的问题是,当我执行程序,图像不发生变化;这让我想,也许线程并没有停止每一圈。

编辑:感谢你们所有人!

+4

答案是使用javax.swing.Timer – ControlAltDel 2014-09-19 20:07:00

+1

你可以用if if(i%2 == 0)... 1.png ... else ... 2来切换所有的if .png ...' – alfasin 2014-09-19 20:10:00

回答

0

问题是,您的循环运行在事件调度线程上,它负责在更改图像时更新它。因此,当你睡觉时,你停止事件调度线程,然后无法更新图像。

解决方法是创建一个单独的线程来运行您的循环,该循环会向Event Dispatch Thread线程发送消息以更改映像。最简单的方法是使用javax.swing.Timer

+0

你不会自己编写单独的线程,你可以使用'javax.swing.Timer'。 – bcsb1001 2014-09-19 20:09:38

+0

@ bcsb1001这就是为什么我故意排除“创建一个单独的线程”的细节。 – 2014-09-19 20:11:23

+0

@ bcsb1001编辑澄清 – 2014-09-19 20:11:51

0
ActionLister al = new ActionListener() { 
    public void actionPerformed(ActionEvent ae) { 
    ... // You will have to keep a counter or check the image already in the label 
    //to know which one to switch it to 
    } 
} 
6

你得到的问题是,你的代码运行在GUI线程上,这是与GUI交谈并将其呈现给屏幕。您可以调用该方法来设置图标,但实际上并没有重新绘制屏幕,​​它只是将事情排队,以便在GUI线程获得一个空闲时刻时重新绘制屏幕。但是,然后你让GUI线程休眠一秒钟,在此期间它不能做任何事情。在整个方法完成之前,它将无法更新屏幕上的任何内容,届时您已完成所有图标更新并全部入睡!

答案是使用javax.swing.TimersetIcon()调用排队以在固定时间间隔后发生。 Timer将启动一个新线程在后台等待一段适当的时间,然后它将调用GUI线程上的setIcon()调用。这是你可以做到的唯一方法:等待必须在后台,但GUI更新调用必须位于GUI线程中。

试试这个:

int delay = 1000; //milliseconds 
ActionListener taskPerformer = new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     imglabel.setIcon(new ImageIcon("1.png")); 
    } 
}; 
new Timer(delay, taskPerformer).start(); 

也要小心,由于ActionListener是一个内部类,它不能引用imglabel除非它是一个final场(但不应该是一个问题:你能总是使它final)。

对于奖励标记,您最好不要创建三个不同的ImageIcon实例,全部来自1.png:您可以创建一个,然后使用它三次。