| 層級 | 類別 | 職責 |
| 頂層容器 | JFrame, JDialog, JWindow | 重量級,對應原生視窗句柄 (HWND/Window/X11 Window) |
| 輕量級容器 | JPanel, JLayeredPane, JRootPane | 無原生句柄,在父容器表面繪製 |
| 基礎組件 | JComponent → Component | 定義 bounds(x,y,w,h)、繼承層次、事件處理、繪圖回調 |
| 佈局管理 | LayoutManager (BorderLayout, FlowLayout...) | 計算子組件幾何位置,不參與實際繪製 |
繪製流程詳解
- 觸發:
repaint() → 系統發送 WM_PAINT (Windows) / Expose (X11)
- 回調:AWT 事件分發線程 (EDT) 調用
paint(Graphics g) / paintComponent(Graphics g)
- 轉換:
Graphics 實為 SunGraphics2D,持有 SurfaceData (目標表面)
- 繪製命令:
g.drawString()、g.fillRect() 等轉為 Java 2D 管線操作
- 管線選擇:根據平台、硬體加速狀態選擇
X11SurfaceData、D3DSurfaceData 等
- 本地調用:JNI 調用原生函數 (如
GDI DrawText、XRender FillRectangles)
- GPU 執行:驅動將命令提交 GPU,光柵化輸出到顯存/幀緩衝區
關鍵技術點
雙緩衝
// 自動雙緩衝 (Swing 默認開啟)
JComponent.setDoubleBuffered(true);
// 手動雙緩衝
BufferStrategy bs = getBufferStrategy();
Graphics g = bs.getDrawGraphics();
// 繪製...
bs.show(); // 交換前後緩衝區
硬體加速開關
-Dsun.java2d.d3d=true # Windows Direct3D 加速
-Dsun.java2d.opengl=true # Linux/macOS OpenGL 加速
-Dsun.java2d.noddraw=true # 禁用 DirectDraw
VolatileImage 加速頻繁繪製
VolatileImage vi = createVolatileImage(w, h);
do {
Graphics2D g = vi.createGraphics();
// 繪製到離屏圖像
g.dispose();
} while (vi.contentsLost());
g.drawImage(vi, 0, 0, null); // 一次性繪製到螢幕
總結
Java AWT/Swing **不直接操作硬體**。Color 只是 ARGB 整數封裝,組件只定義幾何屬性。**真正的繪圖由作業系統原生圖形庫 (GDI/Xlib/CoreGraphics) 執行,最終由顯卡驅動/GPU 光柵化**。理解這層分層架構,有助於排查繪圖異常、優化渲染效能、選擇合適加速管線。
- 上一篇文章: ASP SQL 排序:價格從低到高去掉 DESC 關鍵字
- 下一篇文章: C++ 字符串進制轉換:數字字符串存二進制讀十六進制實現
Copyright ©
程式碼之家 All Rights Reserved