如何在每圈之间制作for循环等待1秒?

Del*_*sco 2 java animation swing

好吧,我正在尝试使用for循环创建一个小动画,代码是下一个:

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){}
     }
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我执行程序时,图像不会改变; 这让我觉得也许Thread没有停止每一圈.

编辑:谢谢你们所有人!

chi*_*ity 6

您遇到的问题是您的代码在GUI线程上运行,这是与GUI对话并将其呈现在屏幕上的.您调用该方法来设置图标,但实际上并没有重绘屏幕,它只是对事物进行排队,以便在下一次GUI线程获得空闲时刻时重新绘制屏幕.但是你让GUI线程休眠一秒钟,在此期间它无法做任何事情.在整个方法完成之前,它将无法更新屏幕上的任何内容,此时您已完成所有图标更新和所有睡眠!

答案是使用a javax.swing.Timer来排队setIcon()在固定间隔后发生的调用.在Timer将启动一个新的线程在后台的时间过去适量等待,然后它会调用setIcon()GUI线程随叫随到.这是你能做到的唯一方法:等待必须在后台,但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();
Run Code Online (Sandbox Code Playgroud)

还要注意,因为它ActionListener是一个内部类,所以它不能引用,imglabel除非它是一个final字段(但这不应该是一个问题:你总能做到它final).

对于奖励标记,理想情况下,您不会创建三个不同的ImageIcon实例1.png:您只能创建一个,然后使用它三次.