在 Frame 窗口中模擬 300 個雪花緩慢下落、到底部自動回頂部循環,涵蓋:
Thread/實現 Runnable 驅動動畫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() 重新隨機,雪花無軌跡
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()
}
}
}
new ClassName() 時自動調用,完成對象初始化。paint() 重複生成。int[] x = new int[300]; 在堆上分配連續 300 個 int 槽位,默認值 0。y[i]++。Thread.sleep(30) 約 33 FPS。repaint() 異步通知 AWT 事件線程調用 paint()。BufferedImage 離屏繪製 → g.drawImage() 消除閃爍。Snowflake 類封裝屬性。KeyListener 消除按鍵對應雪花(打字遊戲雛形)。JFrame/JPanel)獲得雙緩衝預設支援與更豐富組件。