Java 的 AWT (Abstract Window Toolkit) 函式庫提供了構建圖形使用者介面 (GUI) 的基礎元件:按鈕、文字欄位、核取方塊等。掌握事件處理模型,是讓 Applet 具備互動性的關鍵。本文透過一個簡單範例,示範如何捕捉按鈕點擊事件並更新畫面。
import java.awt.*;
import java.applet.*;
public class AppletEvent extends Applet {
int x, y;
Button b;
Color clr;
// 建構子:初始化狀態並加入按鈕
public AppletEvent() {
y = 40;
x = 100;
clr = Color.red;
b = new Button("你就按著玩兒吧!");
add("Center", b); // BorderLayout.CENTER
}
// 繪圖回呼:繪製歡迎文字
public void paint(Graphics g) {
g.setColor(Color.red);
g.setFont(new Font("Helvetica", Font.PLAIN, 24));
g.drawString("InofCD歡迎您!", x, y);
}
// 事件處理:JDK 1.0/1.1 風舊式事件模型
public boolean action(Event ev, Object arg) {
if (ev.target instanceof Button) {
y += 10;
x -= 10;
if (y >= 250) y = 10;
if (x <= 0) x = 100;
repaint(); // 觸發重繪
return true; // 事件已處理
}
return false; // 交由父類別處理
}
}
建構子中設定初始座標 (x, y),建立按鈕並置於 BorderLayout.CENTER。Applet 本身即為一個 Container,可直接加入子元件。
paint(Graphics g)瀏覽器/ AppletViewer 需要重繪時會自動呼叫 paint()。此處根據 x, y 動態繪製字串。注意:不要在 paint() 中執行耗時運算或阻塞呼叫,否則會凍結 UI 執行緒。
action() 方法此範例使用 JDK 1.0/1.1 的舊式事件模型:所有元件的動作事件(按鈕點擊、選單選取等)皆傳遞給 action(Event, Object)。透過 ev.target instanceof Button 判斷事件來源,ev.arg 可取得按鈕標籤文字(此範例未使用)。
現代寫法 (JDK 1.2+):應改用事件監聽器介面 ActionListener,以匿名內部類別或 Lambda 表達式註冊於特定元件,實現關注點分離:
// 現代寫法範例
b.addActionListener(e -> {
y += 10; x -= 10;
if (y >= 250) y = 10;
if (x <= 0) x = 100;
repaint();
});
repaint() 的非同步特性呼叫 repaint() 只是向系統發出重繪請求,實際的 paint() 執行由 AWT 事件派發執行緒 (EDT) 排程。這保證了繪圖操作的執行緒安全性。
雖然 Applet 已成歷史,但其事件處理模型(舊式 action() 與新式 Listener 模式)奠定了 Java GUI 程式設計的基礎。理解事件來源、事件物件、監聽器註冊、重繪機制,對後續學習 Swing、JavaFX 甚至 Android UI 開發皆大有裨益。