これ...
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
UI が終了するまでペイント リクエストを処理しないようにします。EDT をブロックしないでください。
以下の例 (単純) は、画像間を手動で移動する簡単な方法を示しています。
public class FlipPictures {
public static void main(String[] args) {
new FlipPictures();
}
public FlipPictures() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new PicturePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PicturePane extends JPanel {
private JLabel picture;
private File[] pictures;
private int currentPicture = -1;
public PicturePane() {
pictures = new File("/point/me/to/a/directory/of/images").listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
String name = pathname.getName().toLowerCase();
return name.endsWith(".png")
|| name.endsWith(".gif")
|| name.endsWith(".jpg")
|| name.endsWith(".jpeg")
|| name.endsWith(".bmp");
}
});
setLayout(new BorderLayout());
picture = new JLabel();
picture.setHorizontalAlignment(JLabel.CENTER);
picture.setVerticalAlignment(JLabel.CENTER);
add(picture);
JButton change = new JButton("Change");
add(change, BorderLayout.SOUTH);
change.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
changePicture();
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
protected void changePicture() {
if (pictures != null && pictures.length > 0) {
currentPicture++;
if (currentPicture >= pictures.length) {
currentPicture = 0;
}
try {
// This is a potentionally blocking process and really should be threaded...
picture.setIcon(new ImageIcon(ImageIO.read(pictures[currentPicture])));
picture.setText(null);
} catch (IOException ex) {
ex.printStackTrace();
picture.setText(ex.getMessage());
}
} else {
picture.setText("No Pictures :(");
}
}
}
}
更新しました
または、画像を自動的に切り替えたい場合
public class FlipPictures {
public static void main(String[] args) {
new FlipPictures();
}
public FlipPictures() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new PicturePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PicturePane extends JPanel {
private JLabel picture;
public PicturePane() {
setLayout(new BorderLayout());
picture = new JLabel();
picture.setHorizontalAlignment(JLabel.CENTER);
picture.setVerticalAlignment(JLabel.CENTER);
add(picture);
BackgroundSwitcher switcher = new BackgroundSwitcher(this);
switcher.execute();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
public void setPicture(BufferedImage image) {
picture.setIcon(new ImageIcon(image));
}
}
public class BackgroundSwitcher extends SwingWorker<Void, BufferedImage> {
private File[] pictures;
private int currentPicture = -1;
private PicturePane picturePane;
public BackgroundSwitcher(PicturePane picturePane) {
pictures = new File("/point/me/to/a/directory/of/images").listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
String name = pathname.getName().toLowerCase();
return name.endsWith(".png")
|| name.endsWith(".gif")
|| name.endsWith(".jpg")
|| name.endsWith(".jpeg")
|| name.endsWith(".bmp");
}
});
this.picturePane = picturePane;
}
@Override
protected void process(List<BufferedImage> chunks) {
picturePane.setPicture(chunks.get(chunks.size() - 1));
}
@Override
protected Void doInBackground() throws Exception {
if (pictures != null && pictures.length > 0) {
while (true) {
currentPicture++;
if (currentPicture >= pictures.length) {
currentPicture = 0;
}
try {
publish(ImageIO.read(pictures[currentPicture]));
} catch (IOException ex) {
ex.printStackTrace();
}
Thread.sleep(1000);
}
}
return null;
}
}
}
Concurrency in Swing をご覧ください。