自定義 `JPanel` 子類重寫 `public void Paint(Graphics g)`(首字母大寫),期望繪製圓形,但畫布始終空白,`System.out.println` 也未輸出。
Java 區分大小寫。Swing 繪圖機制調用的是 `paint(Graphics g)`(小寫),而非 `Paint`。開發者定義的是新方法,並未覆寫父類方法,因此永遠不會被 `RepaintManager` 調用。
class MyPanel extends JPanel {
@Override // 強烈建議加註解,編譯器會校驗簽名
protected void paintComponent(Graphics g) { // 推薦覆寫 paintComponent
super.paintComponent(g); // 必須調用,清除背景、繪制邊框
// 自定義繪圖代碼
g.drawOval(10, 10, 40, 60);
}
}
| 方法 | 用途 | 備註 |
|---|---|---|
| paint(Graphics) | 重量級繪圖入口,包含邊框、子組件 | 極少直接覆寫 |
| paintComponent(Graphics) | 繪製組件內容區(不含邊框/子組件) | 自定義繪圖首選 |
| paintBorder(Graphics) | 繪製邊框 | 可覆寫自定義邊框 |
| paintChildren(Graphics) | 繪製子組件 | 一般不覆寫 |
public class DrawDemo extends JFrame {
public DrawDemo() {
add(new MyPanel());
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(DrawDemo::new); // EDT 安全啟動
}
}
class MyPanel extends JPanel {
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(10, 10, 40, 60);
}
}