打印页眉和页脚的颜色?

时间:2009-05-21 18:42:48

标签: java swing printing jtable awt

我正在尝试在打印JTable时创建彩色页眉和页脚。具体来说,我在javax.swing.JTable中查看getPrintable(),但是MessageFormat没有给我指定页眉或页脚颜色的选项。

我该怎么做?

澄清 我有兴趣在打印时设置页眉/页脚。例如,记事本会将文件名作为标题添加到您打印的内容中。

更新 似乎没有标准的方法可以做到这一点,有人可以给我一些解决方法吗?到目前为止发布的唯一答案与打印无关(如发送到打印机,不显示到屏幕)页眉/页脚。

从我的评论中复制:我对打印页眉/页脚感兴趣。例如,当您从记事本打印文档时,它会将文件名附加为标题(或者可能是页脚,我不记得确切)

4 个答案:

答案 0 :(得分: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时,将其注入到自定义可打印的新实例中,然后将其与PrinterJob一起使用。

您现在可以根据需要绘制页眉和页脚,但也会丢失一些内容:

  • 您无法使用MessageFormat格式化消息。我相信您可以轻松地将此功能添加到您的可打印页面。
  • 页眉和页脚不会自动定位。你可以粗略估计这些。

编辑:我查看了Java Sources,并且有一个私有类TablePrintable可以完成所有工作。您可以在源代码处达到峰值,以查看页眉和页脚的打印方式。然后,您可以将此功能移动到Printable类。

答案 1 :(得分:0)

这有点偏离左侧字段,但您可以使用iText之类的库来创建PDF文档,然后将其发送到打印机。您将获得对文档外观和表示的更高级别的控制,包括管理表格行如何突破页面边界的能力,并且您将能够非常轻松地设置页眉和页脚

您可以按照以下说明使用Java打印PDF:http://www.juixe.com/techknow/index.php/2008/01/17/print-a-pdf-document-in-java/

答案 2 :(得分: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让我知道你是如何继续下去的:)

答案 3 :(得分:-1)

很简单:

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