示範在 Applet 中註冊 `MouseListener` (透過 `MouseAdapter`),捕捉滑鼠點擊座標,並即時繪製十字準線與座標文字。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class MouseAd extends Applet {
private int x = 0, y = 0;
@Override
public void init() {
// 使用匿名內部類簡化代碼 (JDK 1.1+)
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
repaint(); // 觸發重繪
}
});
}
@Override
public void paint(Graphics g) {
Dimension d = getSize();
g.drawString("x=" + x + " y=" + y, 10, 20);
g.drawLine(x, 0, x, d.height); // 垂直線
g.drawLine(0, y, d.width, y); // 水平線
}
}
| 項目 | 說明 |
|---|---|
| 事件委派模型 | `addMouseListener` 註冊監聽器,AWT 事件佇列分派 `MouseEvent` |
| MouseAdapter | 空實現 `MouseListener` 介面,僅覆寫關心的 `mousePressed`,避免實作 5 個方法 |
| 座標系 | `e.getX()/getY()` 相對於 Applet 左上角 (0,0) |
| 主動重繪 | `repaint()` 排程 `paint()`,非立即執行;`update()` 預設清屏再呼叫 `paint()` |
<applet code="MouseAd.class" width="300" height="200"> 您的瀏覽器不支援 Java Applet。 </applet>
// Swing JFrame 版
JFrame frame = new JFrame("Mouse Demo");
frame.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
System.out.println("Clicked at: " + e.getPoint());
}
});
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
核心 API (`MouseEvent`、`MouseListener`、`MouseAdapter`) 完全相容,僅容器從 `Applet` 換為 `JComponent`/`Node`。