我正在处理一项正在处理的任务。
部分原因是“动画”一对模具的滚动。我有6个JPEGS,每个边都有一个。而不是滚动,我希望它循环通过图像。我试图在循环中反复使用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()是我正在调用以执行循环的函数(私有,因为我不想在我的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作为编辑器,并使用Component Palette进行基本布局和代码生成。
- 由于
答案 0 :(得分:3)
首先,您必须在gui线程上进行更改。参见
SwingUtils.invokeLater。
Thread.sleep也不会削减它,你应该使用javax.swing.Timer指定何时切换图标。
答案 1 :(得分:1)
有一个UI线程管理事件和重新绘制(更新屏幕)。你让它入睡。这样做意味着在它醒来之前不会发生任何其他事情(关于UI)。
在actionPerformed方法中,启动一个将进行重新绘制的新线程。那应该解决它。