2009-05-21 126 views
2

我想在打印JTable時創建彩色頁眉和頁腳。具體來說,我正在查看javax.swing.JTable中的getPrintable(),但MessageFormat不提供指定頁眉或頁腳顏色的選項。打印頁眉和頁腳顏色?

我該怎麼辦?

澄清 我有興趣在打印時設置頁眉/頁腳。例如,記事本將文件名附加到您打印的標題上。

更新 似乎沒有這樣做的標準方式,有人可以給我一些解決方法嗎?到目前爲止發佈的唯一答案與打印無關(如發送到打印機,不顯示到屏幕)頁眉/頁腳。

複製從我的評論:我感興趣的打印頁眉/頁腳。例如,當您從記事本打印文檔時,它會將文件名追加爲標題(或者其頁腳,我不記得確切)

回答

3

一個解決方案,我能想到的就是用自己的打印上了車:

public class CustomTablePrintable implements Printable { 

    Printable tablePrintable; 

    public void setTablePrintable(Printable printable) { 
     tablePrintable = printable;   
    } 

    public int print(Graphics graphics, PageFormat pageFormat, 
      int pageIndex) throws PrinterException { 
     if (pageIndex > 0) { 
      return NO_SUCH_PAGE; 
     } 

     tablePrintable.print(graphics, pageFormat, pageIndex); 

     Graphics2D g2d = (Graphics2D)graphics; 
     g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 

     // Draw header/footer here 
     graphics.drawString(header, posx, posy); 

     return PAGE_EXISTS;   
    } 
} 

當您從您的JTable調用getPrintable時,將它注入到一個新的實例中以進行自定義打印和th在PrinterJob中使用它。

您現在可以先草擬的頁眉和頁腳,如你所願,但你也失去了一些東西:

  • 不能使用的MessageFormat格式化的消息。我相信您可以輕鬆地將此功能添加到您的可打印內容中。
  • 頁眉和頁腳未自動定位。你可以對這些有粗略的估計。

編輯:我已經看過了Java源代碼,並有私有類TablePrintable做所有的工作。您可以在源代碼處查看峯值,以查看頁眉和頁腳的打印方式。然後,您可以將此功能移到您的Printable類。

+0

看起來不錯我會給這個嘗試 – 2009-05-29 10:00:30

0

此代碼主要來自www.java2s.com,其中包含更改如何改變顏色。這不是最漂亮的解決方案,但希望能幫助你。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.border.Border; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 

public class MainClass { 
    public static void main(String args[]) { 
    String rows[][] = { { "A", "a" }, { "B", "b" }, { "E", "e" } }; 
    String headers[] = { "Upper", "Lower" }; 

    JFrame frame = new JFrame("Label Header"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JTable table = new JTable(rows, headers); 
    JScrollPane scrollPane = new JScrollPane(table); 

    Border headerBorder = UIManager.getBorder("TableHeader.cellBorder"); 

    JLabel headerLabel1 = new JLabel(headers[0], JLabel.CENTER); 
    headerLabel1.setBorder(headerBorder); 

    // Here is where the color is changed. 
    headerLabel1.setBackground(new Color(255, 0, 0)); 
    headerLabel1.setForeground(new Color(0, 0, 255)); 
    // End of color change. 

    JLabel headerLabel2 = new JLabel(headers[1], JLabel.CENTER); 
    headerLabel2.setBorder(headerBorder); 

    TableCellRenderer renderer = new JComponentTableCellRenderer(); 

    TableColumnModel columnModel = table.getColumnModel(); 

    TableColumn column0 = columnModel.getColumn(0); 
    TableColumn column1 = columnModel.getColumn(1); 

    column0.setHeaderRenderer(renderer); 
    column0.setHeaderValue(headerLabel1); 

    column1.setHeaderRenderer(renderer); 
    column1.setHeaderValue(headerLabel2); 

    frame.add(scrollPane, BorderLayout.CENTER); 
    frame.setSize(300, 150); 
    frame.setVisible(true); 
    } 
} 

class JComponentTableCellRenderer implements TableCellRenderer { 
    public Component getTableCellRendererComponent(JTable table, Object value, 
     boolean isSelected, boolean hasFocus, int row, int column) { 
    return (JComponent)value; 
    } 
} 

最重要的位:

// Here is where the color is changed. 
    headerLabel1.setBackground(new Color(255, 0, 0)); 
    headerLabel1.setForeground(new Color(0, 0, 255)); 
    // End of color change. 

HTH讓我知道你如何與它:)

+0

如果我沒有記錯的話,你在這裏設置表的頁眉/頁腳。我對打印頁眉/頁腳感興趣。例如,當您從記事本打印文檔時,它會將文件名追加爲標題(或者可能是其頁腳,我不記得確切) – 2009-05-22 12:03:23

-1

這很容易:

JTable table = new JTable(); 
      ((DefaultTableCellRenderer)table.getTableHeader().getColumnModel().getColumn(4).getHeaderRenderer()).setForeground(Color.ORANGE); 
+2

downvoted:a)與問題b)不安全的類型轉換c)對空列標題渲染器無保護d)... – kleopatra 2011-06-14 10:26:32