標準 java.awt.print.Printable 要求開發者手動:
Graphics 上逐字繪製代碼量大、易出錯、且與螢幕顯示邏輯重複度高。
Swing 的 JEditorPane 已內建完整的文本排版引擎(View 樹、分頁、樣式、圖片)。DocumentRenderer 將文檔放入隱形 JEditorPane,直接複用其 View 體系進行分頁繪製,「所見即所得」從螢幕延伸到紙張。
HTMLDocument(HTML 3.2/4.0 子集)PlainDocument(純文本)RTFDocument(Rich Text Format)JEditorPane 識別的類型(微調即可支援)DocumentRenderer renderer = new DocumentRenderer();
renderer.print(htmlDocument); // 自動彈出打印對話框、分頁、縮放
RTF 需包裝在 JEditorPane 中:
renderer.print(rtfEditorPane);
| 特性 | 說明 |
|---|---|
| 智能分頁 | 不在行中間斷開,不切割字符,自動計算分頁符位置 |
| 樣式保真 | 字體、顏色、圖標、表格、多欄佈局完整保留 |
| 縮放適配 | setScaleWidthToFit(true) 自動縮放寬度超紙寬的內容 |
| 頁面設置 | pageDialog() 彈出標準頁面設置對話框(紙張、邊距、方向) |
| 取消支援 | 打印對話框提供取消按鈕,用戶可隨時中止 |
JEditorPane,設置文檔,寬度 = 打印區寬度,調用 validate() 觸發佈局生成 View 樹。View root = pane.getUI().getRootView(pane)。View.getViewCount() == 0)。getPreferredSpan(View.Y_AXIS) 是否超出頁面剩餘高度。view.paint(g, allocation) 直接繪製;放不下 → 記錄分頁位置,換頁後繼續。Graphics 屬性。完整源碼(< 200 行,含詳細註釋)可從文章附件下載。將 DocumentRenderer.java 放入項目,即可為任何 Swing 文本組件添加專業級打印能力。