繁体   English   中英

Java-Swing:ImageIcon无法在运行时更改?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM