Swing JTable 本身不提供直接打印方法 (Java 6+ 引入 JTable.print() 前)。利用 Toolkit.getPrintJob() 獲取 PrintJob,將組件繪製到打印圖形上下文中,是經典的客戶端打印方案。
private void printTable() {
Toolkit kit = Toolkit.getDefaultToolkit();
Properties props = new Properties();
props.put("awt.print.printer", "durango"); // 打印機名
props.put("awt.print.numCopies", "2"); // 複印份數
if (kit != null) {
PrintJob printJob = kit.getPrintJob(this, "打印頁面", props);
if (printJob != null) {
Graphics pg = printJob.getGraphics();
if (pg != null) {
Graphics2D g2 = (Graphics2D) pg;
PageFormat pf = new PageFormat();
// 平移坐標系至可打印區域
g2.translate(pf.getImageableX(), pf.getImageableY());
try {
// 關鍵:打印包含 JTable 的 JScrollPane (或整個面板)
this.jScrollPane14.printAll(pg);
} finally {
pg.dispose(); // 釋放圖形資源
}
}
printJob.end(); // 結束打印作業,送入打印隊列
}
}
}
getPrintJob → getGraphics → 繪製 → dispose → end,缺一不可。printAll(Graphics) 會遞歸繪製組件及其子組件。傳入 JScrollPane 可包含表頭與視口內可見行;若需分頁打印大數據集,需自行實現分頁邏輯 (計算行高、分頁符、重繪表頭)。g2.translate(...) 確保內容不超出頁邊距。awt.print.printer 指定打印機,numCopies 份數,視平台/驅動支持情況生效。// 簡單一行搞定,支持分頁、表頭重複、頁眉頁腳
boolean complete = jTable.print(JTable.PrintMode.FIT_WIDTH,
new MessageFormat("第 {0} 頁"), new MessageFormat("報表標題"));
推薦優先使用 JTable.print(),僅在舊版本環境或需極致控制繪製細節時使用 AWT Print API。
printAll 僅繪製當前視口。解決:臨時調整 JTable 大小或實現分頁渲染。Graphics2D 設定支持中文的字體 (g2.setFont(new Font("SimSun", Font.PLAIN, 12)))。getPrintJob 返回 null,需友好提示用戶配置默認打印機。