我正在处理的作业遇到一些问题。
其中一部分是为一对骰子的滚动“制作动画”。我有 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/