0

パネルを含むメインフレームがあります。このパネルには、アプリケーションが実行されている限りラベル イメージを変更するスレッドが必要です...

ランナブルを実装するパネルを作成し、メインフレームでこのパネルのインスタンスを作成すると、アプリケーションは無限ループに入ります...私のコードは次のとおりです。

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で呼び出す必要があるため、呼び出さないでください。代わりに、単にスイングタイマーを使ってみませんか?
  • また、ディスクからイメージを継続的に読み込む必要はありません。代わりに、画像を一度に読み取り、ImageIconを配列に配置するか、SwingTimerArrayList<ImageIcon>のアイコンを繰り返し処理します。
  • run()スレッド化をまったく行っていないRunnableオブジェクトを直接呼び出しているため、コードは実際にはバックグラウンドスレッドを使用していません。RunnablesとThreads(スレッドで呼び出すヒント)の使用方法については、スレッドチュートリアルをお読みください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();

詳細については、 SwingTimerチュートリアルをご覧ください。

于 2012-07-02T21:57:53.753 に答える