java - 更新 Jlabel 图像时出现奇怪的问题

标签 java jlabel

我正在处理的作业遇到一些问题。

其中一部分是为一对骰子的滚动“制作动画”。我有 6 张 JPEG,每一面各一张。我希望它循环浏览图像,而不是滚动。我试图在循环中一遍又一遍地使用 setIcon,并使用 Thread.sleep() 进行延迟。除其他事项外,这一切都在用户点击按钮(事件)时发生。它不会显示图像,而是等待正确的时间并仅显示最后一个图像。这是我调用来执行循环的函数:

private void aniRoll(){
    for(int i = 0; i < 10; i++){
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg")));
        try{
            Thread.sleep(1000); // Sleep for 1 sec
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face3.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face4.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face5.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}
        die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face6.jpg")));
        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e){}

    }

}

die1Disp 是我的 JLabel 的名称,aniRoll() 是我调用来执行循环的函数(设为私有(private),因为我不希望 GUI 类之外的任何内容调用它),faceX.jpg是我的图像。

我无法理解的是,无论我将 Thread.sleep() 放在哪里,它都会首先延迟程序,然后只显示最后一个图像。例如:

die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face1.jpg")));

die1Disp.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face2.jpg")));

//bunch of extra code

try{
    Thread.sleep(10000); // Sleep for 10 sec
}
catch(InterruptedException e){}

这将等待 10 秒,然后仅显示第二张图像。它不会快速显示第一个图像,显示第二个图像,然后等待,它等待并只显示第二个图像。这个怪癖确实让我困惑,我不知道如何纠正它。我使用 NetBeans IDE 7.01 作为编辑器,对于基本布局和代码生成,我使用组件面板。

--谢谢

最佳答案

首先您必须在 GUI 线程上进行更改。参见

SwingUtils.invokeLater。

而且 Thread.sleep 不会削减它,您应该使用 javax.swing.Timer 来指定何时切换图标。

关于java - 更新 Jlabel 图像时出现奇怪的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461646/

相关文章:

java - 如何使光标可以输入 jtextfield 但给它一个文本的唯一方法是单击一个按钮?

java - 不要在 JLabel 中使用 XML 文件读取 '&lt;'

java - 在条件后更改 JLabel 图标

java - 使用 for 循环更改 JLabel 文本

java - XtextDocumentProvider 的依赖注入(inject)配置

java - 无法在 java 路径中找到属性文件

java - 如果在线程上调用 java wait(),该方法也会在 run() 方法终止时退出

java - 如何显示表中属性的属性 - Java

java - 将图像从文件系统添加到 Jlabel

java - 在 jdialog 表单上显示图像时出错