AWT 采用委派事件模型:事件源、事件對象、監聽器接口。
Button btn1 = new Button("start");
Button btn2 = new Button("stop");
Monitor2 m2 = new Monitor2();
btn1.addActionListener(m2);
btn2.addActionListener(m2);
btn2.setActionCommand("GameOver"); // 自定義命令字符串
class Monitor2 implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand()); // 區分按鈕
}
}
TextField num1 = new TextField(10), num2 = new TextField(10), num3 = new TextField(15);
Button btnEqual = new Button("=");
btnEqual.addActionListener(new MyMonitor(num1, num2, num3));
class MyMonitor implements ActionListener {
TextField n1, n2, n3;
public MyMonitor(TextField n1, TextField n2, TextField n3) { this.n1=n1; this.n2=n2; this.n3=n3; }
public void actionPerformed(ActionEvent e) {
int a = Integer.parseInt(n1.getText());
int b = Integer.parseInt(n2.getText());
n3.setText(String.valueOf(a+b));
n1.setText(""); n2.setText("");
}
}
內部類可直接訪問外部類私有成員,無需傳遞引用。
class MyMathFrame extends Frame {
TextField num1, num2, num3;
// ...
btnEqual.addActionListener(new MyMonitor()); // 內部類
private class MyMonitor implements ActionListener {
public void actionPerformed(ActionEvent e) {
int a = Integer.parseInt(num1.getText()); // 直接訪問
// ...
}
}
}
public void paint(Graphics g) {
g.setColor(Color.red);
g.fillOval(100,100,100,100); // 實心圓
g.setColor(Color.green);
g.fillRect(150,200,200,200); // 實心矩形
// 恢復畫筆顏色
g.setColor(g.getColor());
}
paint() 由系統自動調用(窗口顯示、恢復最小化等)。
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
points.add(new Point(e.getX(), e.getY()));
repaint(); // 觸發 paint()
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
}
});
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP)
System.out.println("按下上鍵");
}
});
AWT 雖屬較早期 GUI 技術,但其事件模型、繪圖機制、內部類應用等核心思想對理解 Swing、JavaFX 乃至現代 UI 框架仍具參考價值。