有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在JFrame中使用线程

我有一个包含面板的大型机。我想在这个面板中的线程改变标签图像,只要应用程序正在运行

当我创建实现runnable的面板,然后在大型机中创建该面板的实例时,应用程序进入无限循环。。。我的代码如下:

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) {}
        }
    }

共 (1) 个答案

  1. # 1 楼答案

    • 不要在后台线程中调用JLabel#setIcon(...),因为这必须在Swing事件线程或EDT上调用。相反,为什么不干脆给我们一个摆动计时器呢
    • 而且,不需要从磁盘上连续读取映像。相反,只需读取一次图像,然后将图像图标放入数组或ArrayList<ImageIcon>中,然后在Swing计时器中迭代图标即可
    • 您的代码实际上不使用后台线程,因为您直接在您的可运行对象上调用run(),而该对象根本不执行任何线程。请阅读threading tutorial以了解如何使用可运行文件和线程(提示您在线程上调用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 Tutorial