本範例示範如何使用 Java Swing 建立一個視窗,每隔固定時間自動切換顯示下一張圖片,形成簡易的動畫播放效果。圖片檔案置於專案的 bin/靜態圖/花好月圓/ 目錄下,檔名為 1001.jpg 至 1016.jpg。
package 靜態圖;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class Donttai extends JFrame implements Runnable {
private String path = "bin/靜態圖/花好月圓/10"; // 專案根目錄為基準
private int idx = 1;
public Donttai() {
initComponents();
}
@Override
public void paint(Graphics g) {
super.paint(g); // 重要:呼叫父類別 paint 以清除舊畫面
ImageObserver observer = new ImageObserver() {
@Override
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
return false; // 簡單處理:不等待圖片載入完成
}
};
try {
String fileName;
if (idx <= 9) {
fileName = path + "0" + idx + ".jpg"; // 1001 ~ 1009
} else {
fileName = path + idx + ".jpg"; // 1010 ~ 1016
}
Image img = ImageIO.read(new File(fileName));
g.drawImage(img, 100, 50, 400, 300, observer);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
repaint(); // 觸發 paint()
if (idx < 16) idx++;
else idx = 1;
try {
Thread.sleep(60); // 每幀 60ms 約 16.7 FPS
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// ----- 以下為視窗初始化程式碼(可由 GUI 產生器自動產生) -----
private javax.swing.JButton jButton1;
private void initComponents() {
jButton1 = new javax.swing.JButton("jButton1");
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(483, Short.MAX_VALUE)
.addComponent(jButton1).addGap(35, 35, 35)));
layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup().addGap(37, 37, 37)
.addComponent(jButton1).addContainerGap(392, Short.MAX_VALUE)));
pack();
}
public static void main(String[] args) {
Donttai frame = new Donttai();
frame.setVisible(true);
frame.run(); // 在主執行緒直接跑動畫迴圈(示範用;實務上建議另開執行緒)
}
}
bin/... 即可讀取編譯後的資源。idx 區分個位數與雙位數檔名(1001 vs 1010)。run() 中呼叫 repaint() 觸發重繪,配合 Thread.sleep() 控制幀率。ImageIcon 或預先載入所有 BufferedImage 至記憶體,避免每幀都讀取磁碟造成效能瓶頸。new Thread(this).start()),避免阻塞 EDT(事件派發執行緒)。javax.swing.Timer 替代 Thread.sleep(),更符合 Swing 執行緒安全規範。List<BufferedImage>,消除 I/O 延遲。