0

我有一个包含面板的 mainFrame。只要应用程序正在运行,我希望在此面板中更改标签图像的线程...

当我创建实现可运行的面板,然后在大型机中创建此面板的一个实例时,应用程序进入无限循环......我的代码如下:

public mainFrame()
{
     BanerPanel baner = new BanerPanel();
     baner.run();
}

public class Banner_Panel extends JPanel implements Runnable {

    public Banner_Panel() {
        initComponents();
        imgPath = 2;
        imgLbl = new JLabel(new ImageIcon(getClass().getResource("/Photos/banner_4-01.png")));
        add(imgLbl);
        //run();
    }
    @Override
    public void run() {
        while(true)
        {
            try {
            while (true) {
                Thread.sleep(3000);
                switch(imgPath)
                {
                    case 1:
                        imgLbl.setIcon(new ImageIcon(getClass().getResource("/Photos/banner_4-01.png")));
                        imgPath = 2;
                        break;
                    case 2:
                        imgLbl.setIcon(new ImageIcon(getClass().getResource("/Photos/banner_1-01.png")));
                        imgPath = 3;
                        break;
                    case 3:
                        imgLbl.setIcon(new ImageIcon(getClass().getResource("/Photos/banner_2-01.png")));
                        imgPath = 4;
                        break;
                    case 4:
                        imgLbl.setIcon(new ImageIcon(getClass().getResource("/Photos/banner_3-01.png")));    
                        imgPath = 1;
                        break;
                }

            }
            } catch (InterruptedException iex) {}
        }
    }
4

1 回答 1

8
  • 不要调用JLabel#setIcon(...)后台线程,因为这必须在 Swing 事件线程或 EDT 上调用。相反,为什么不简单地使用我们的 Swing Timer?
  • 此外,无需不断地从磁盘读取映像。取而代之的是,一次读取图像并将 ImageIcons 放在一个数组中,或者ArrayList<ImageIcon>简单地遍历 Swing Timer 中的图标。
  • 您的代码实际上不使用后台线程,因为您run()直接在 Runnable 对象上调用,该对象根本不执行任何线程。请阅读线程教程以了解如何使用 Runnables 和线程(提示您调用start()线程)。

例如

// LABEL_SWAP_TIMER_DELAY a constant int = 3000
javax.swing.Timer myTimer = new javax.swing.Timer(LABEL_SWAP_TIMER_DELAY, 
      new ActionListener(){
  private int timerCounter = 0;

  actionPerformed(ActionEvent e) {
    // iconArray is an array of ImageIcons that holds your four icons.
    imgLbl.setIcon(iconArray[timerCounter]);
    timerCounter++;
    timerCounter %= iconArray.length;
  }
});
myTimer.start();

更多信息,请查看Swing Timer 教程

于 2012-07-02T21:57:53.753 回答