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

Java GUI 入門實戰:用 AWT 實現下雪動畫,講解構造器、線程、數組與繪圖機制

     編輯:Java 綜合教學

專案目標

在 Frame 窗口中模擬 300 個雪花緩慢下落、到底部自動回頂部循環,涵蓋:

  • AWT 基礎組件(Frame, Panel, Graphics)
  • 繼承 Thread/實現 Runnable 驅動動畫
  • 數組批量管理座標
  • 構造器初始化數據
  • 雙緩衝思路(此處用全量重繪簡化)

核心代碼演進

版本 1:朴素隨機重繪(雪花亂飛)

public void paint(Graphics g) {
    g.setColor(Color.WHITE);
    for (int i=0; i<300; i++) {
        g.drawString("*", (int)(Math.random()*1024), (int)(Math.random()*768));
    }
}
// 每次 repaint() 重新隨機,雪花無軌跡

版本 2:構造器預生成座標 + 線程更新 Y 軸

class SnowPanel extends Panel implements Runnable {
    int[] x = new int[300];
    int[] y = new int[300];

    // 構造器:對象創建時自動執行,初始化座標
    public SnowPanel() {
        for (int i=0; i<300; i++) {
            x[i] = (int)(Math.random()*1024);
            y[i] = (int)(Math.random()*768);
        }
    }

    public void paint(Graphics g) {
        g.setColor(Color.WHITE);
        for (int i=0; i<300; i++) g.drawString("*", x[i], y[i]);
    }

    public void run() {
        while (true) {
            for (int i=0; i<300; i++) {
                y[i]++; if (y[i] > 768) y[i] = 0; // 循環下落
            }
            try { Thread.sleep(30); } catch (InterruptedException ignored) {}
            repaint(); // 觸發 paint()
        }
    }
}

關鍵知識點解析

構造器

  • 與類同名、無返回值聲明(連 void 都無)。
  • new ClassName() 時自動調用,完成對象初始化。
  • 可重載,若未顯式定義則編譯器生成無參默認構造器。
  • 本例中用於「一次性生成 600 個隨機數」,避免在 paint() 重複生成。

數組:批量變量的容器

  • int[] x = new int[300]; 在堆上分配連續 300 個 int 槽位,默認值 0。
  • 下標訪問 O(1),適合固定數量、同類型數據批量管理。

動畫循環三要素

  1. 狀態更新:線程中修改 y[i]++。
  2. 延時控制:Thread.sleep(30) 約 33 FPS。
  3. 觸發重繪:repaint() 異步通知 AWT 事件線程調用 paint()。

進階優化方向

  • 雙緩衝:BufferedImage 離屏繪製 → g.drawImage() 消除閃爍。
  • 雪花大小/速度/圖片隨機化:定義 Snowflake 類封裝屬性。
  • 鍵盤/滑鼠交互:實現 KeyListener 消除按鍵對應雪花(打字遊戲雛形)。
  • 遷移至 Swing(JFrame/JPanel)獲得雙緩衝預設支援與更豐富組件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved