2016-05-21 14 views
0

3つの異なるjlableに異なるイメージを表示しようとしています。画像が入ったフォルダがあります。私は画像をjlableに表示しており、画像は60秒後に変更する必要があります。私が何を試しても、私はそれをすることはできません。誰かが私を助けることができますか?jlableでイメージを自動的に変更する方法

+0

@MadProgrammerこの質問にはjTableはありません。 – ziLk

+0

@zilk私の電話では、jtableと書かれています。P – MadProgrammer

+0

シンプルなスイングタイマーを作成します([スイングタイマーの使い方]を参照)(http://docs.oracle.com/javase/tutorial/uiswing/misc/timer。 html)を参照してください。 – MadProgrammer

答えて

2

簡単な答えは、スウィングTimerを使用することです。将来、イベントディスパッチスレッドのコンテキスト内で配信されるコールバックをスケジュールすることができます。

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JLabel label; 
     private File[] images; 
     private int imageIndex; 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      label = new JLabel(); 
      label.setHorizontalAlignment(JLabel.CENTER); 
      label.setVerticalAlignment(JLabel.CENTER); 
      add(label); 
      images = new File("...").listFiles(); 
      imageIndex = -1; 
      nextImage(); 
      Timer timer = new Timer(1000, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        nextImage(); 
       } 
      }); 
      timer.start(); 
     } 

     protected void nextImage() { 
      if (images.length > 0) { 
       imageIndex++; 
       if (imageIndex >= images.length) { 
        imageIndex = 0; 
       } 
       try { 
        BufferedImage image = ImageIO.read(images[imageIndex]); 
        label.setIcon(new ImageIcon(image)); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(400, 400); 
     } 

    } 

} 

詳しくはHow to use Swing Timersをご覧ください。

画像が大きく、インターネットなどの遅いサービスから来た場合は、代わりにSwingWorkerを使用することを検討してください。これにより、バックグラウンドで(バックグラウンドで)長時間実行またはブロックする操作が可能になります。アップデートをEDTに同期させる方が簡単です。詳細はRefresh Image in JLabel with Timerをご覧ください

関連する問題