首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Swing 實作圖片循環播放動畫

     編輯:Java 相關知識

Java Swing 圖片輪播元件實作

本範例示範如何使用 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(); // 在主執行緒直接跑動畫迴圈(示範用;實務上建議另開執行緒)
    }
}

關鍵點解析

  1. 路徑處理:Java 應用程式的工作目錄預設為專案根目錄,故使用相對路徑 bin/... 即可讀取編譯後的資源。
  2. 檔名格式化:利用 idx 區分個位數與雙位數檔名(1001 vs 1010)。
  3. 動畫迴圈:run() 中呼叫 repaint() 觸發重繪,配合 Thread.sleep() 控制幀率。
  4. 資源釋放:實務專案建議使用 ImageIcon 或預先載入所有 BufferedImage 至記憶體,避免每幀都讀取磁碟造成效能瓶頸。

改進建議

  • 將動畫迴圈移至獨立執行緒(new Thread(this).start()),避免阻塞 EDT(事件派發執行緒)。
  • 使用 javax.swing.Timer 替代 Thread.sleep(),更符合 Swing 執行緒安全規範。
  • 預先載入圖片至 List<BufferedImage>,消除 I/O 延遲。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved