首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

使用 Java AWT Print API 實現 JTable 數據打印輸出

     編輯:Java 相關知識

需求背景

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(); // 結束打印作業,送入打印隊列
        }
    }
}

關鍵點解析

  • PrintJob 生命周期:getPrintJob → getGraphics → 繪製 → dispose → end,缺一不可。
  • 打印範圍:調用 printAll(Graphics) 會遞歸繪製組件及其子組件。傳入 JScrollPane 可包含表頭與視口內可見行;若需分頁打印大數據集,需自行實現分頁邏輯 (計算行高、分頁符、重繪表頭)。
  • 坐標轉換:g2.translate(...) 確保內容不超出頁邊距。
  • 屬性配置:awt.print.printer 指定打印機,numCopies 份數,視平台/驅動支持情況生效。

現代替代方案 (Java 6+)

// 簡單一行搞定,支持分頁、表頭重複、頁眉頁腳
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,需友好提示用戶配置默認打印機。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved