常見錯誤:覆寫 printComponent 而非 paintComponent 導致 repaint() 不會呼叫自訂繪圖邏輯,說明 Swing 繪圖機制正確的方法簽名與呼叫流程。
class GamePanel extends JPanel {
public void display() {
System.out.println("GamePanel's display!");
this.repaint();
}
protected void printComponent(Graphics g) { // 錯誤方法名
System.out.println("GamePanel's PrintComponent");
}
}
執行結果:僅印出 GamePanel's display!,printComponent 從未被呼叫。
@Override
protected void paintComponent(Graphics g) { // 正確:paintComponent
super.paintComponent(g); // 必須先呼叫父類實作
System.out.println("GamePanel's PaintComponent");
// 自訂繪圖邏輯...
}
repaint() 排程重繪,最終由事件派發執行緒 (EDT) 呼叫 paintComponent(Graphics)。JComponent 定義 paintComponent 為 protected,子類別需 @Override 覆寫。printComponent 是印表列印用的不同方法,不參與螢幕重繪流程。paintComponent (大小寫敏感)。Graphics g (非 Graphics2D,雖可轉型)。super.paintComponent(g) 清除背景。@Override 註解讓編譯器檢查簽名。