[英]Java-Swing : The ImageIcon cannot change in runtime?
我在java中有这段代码
private void buttonShowImageActionPerformed(java.awt.event.ActionEvent evt)
{
if(folderFiles != null)
{
for(int i=0; i<folderFiles.size(); i++)
{
icon = new ImageIcon(folderFiles.get(i));
labelImage.setIcon(icon);
timeDelay(2); // A method that delays 2 secs - it works
}
}
}
当我按下按钮时,它会等待一段时间,从第一张开始到最后一张图像,然后逐个跳过文件夹中的图像。延迟方法有效(我已经测试过)谢谢!
关于:
纯滞后(2); //延迟2秒的方法-它有效
不,无论您如何测试,它都行不通。 Swing不能那样工作,您最好避免做出这样的假设。 使用摇摆计时器。
您会问,我怎么知道它不起作用,我会告诉您:该代码不会调用后台线程,也不会启动Swing Timer,因此它唯一能做的就是延迟当前时间。线程,可能在某个地方带有Thread.sleep(...)
。 如果您对此进行调用并“测试”,是的,这将导致延迟,这些延迟将显示在控制台的System.out.println(...)
语句中,但是也会使Swing事件线程休眠,并将您的申请入睡。 所以你真的不想这样做。
实际上,查看其是否在Swing中有效的最佳测试是您当前的代码。 那会发生什么呢? 您声明:
当我按下按钮时,它会等待一段时间,从第一张开始到最后一张图像,然后逐个跳过文件夹中的图像
因此,实际上,您知道延迟对Swing无效,因为您描述了在Swing事件线程上脚的经典代码症状,使之屈膝。 因此,再次使用Swing计时器。 这是Swing Timer教程的链接 。
如果这是我的代码,我不会在每次按下按钮时读取图像,而是一次读取所有图像,并且一次读取一次,然后将它们放入称为iconList的ArrayList<ImageIcon>
。 假设您这样做了,那么代码可能如下所示:
private void buttonShowImageActionPerformed(java.awt.event.ActionEvent evt) {
// !! I'd use a variable or constant instead of the magic number 2000
new Timer(2000, new ActionListener() {
int count = 0;
actionPerformed(ActionEvent e) {
if (count != iconList.size()) {
labelImage.setIcon(iconList.get(count));
count++;
} else {
// stop the Timer
((Timer) e.getSource()).stop();
}
}
}).start();
}
编辑
你问:
我的朋友最后一个问题.....我输入“ int count = 0;”。 在actionPerformed内部,什么也没发生……我不明白为什么只有在方法之外才能起作用。
请了解,Swing Timer的工作方式是在这里每2000秒重复调用actionPerformed方法。 我的代码所做的是,当计时器启动时,计数设置为0。每次调用actionPerformed方法时,计数将增加1,并显示下一个ImageIcon。
使用您的代码,当调用actionPerformed方法时,计数被重置为0,显示第一个图像,然后计数增加。 但是,每次调用actionPerformed方法时,您的代码都会将计数重置为0 ,因此增量无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.