0
3つの異なるjlableに異なるイメージを表示しようとしています。画像が入ったフォルダがあります。私は画像をjlableに表示しており、画像は60秒後に変更する必要があります。私が何を試しても、私はそれをすることはできません。誰かが私を助けることができますか?jlableでイメージを自動的に変更する方法
3つの異なるjlableに異なるイメージを表示しようとしています。画像が入ったフォルダがあります。私は画像をjlableに表示しており、画像は60秒後に変更する必要があります。私が何を試しても、私はそれをすることはできません。誰かが私を助けることができますか?jlableでイメージを自動的に変更する方法
簡単な答えは、スウィング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をご覧ください
@MadProgrammerこの質問にはjTableはありません。 – ziLk
@zilk私の電話では、jtableと書かれています。P – MadProgrammer
シンプルなスイングタイマーを作成します([スイングタイマーの使い方]を参照)(http://docs.oracle.com/javase/tutorial/uiswing/misc/timer。 html)を参照してください。 – MadProgrammer