2009-05-21 128 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