首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Swing 繪圖不生效?paint 方法大小寫陷阱與調用機制詳解

     編輯:程式設計綜合問答

現象

自定義 `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)繪製子組件一般不覆寫

觸發重繪

  • 主動調用 `repaint()`:異步請求,Swing 合併多次調用,效率高。
  • 調用 `revalidate()`:布局改變時調用,會觸發 `repaint`。
  • 不要直接調用 `paint()`/`paintComponent()`,繞過雙緩衝機制會導致閃爍。

完整可運行示例

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);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved