Java 用彩色打印页眉和页脚?

Java 用彩色打印页眉和页脚?,java,swing,printing,jtable,awt,Java,Swing,Printing,Jtable,Awt,我试图在打印JTable时创建彩色页眉和页脚。具体地说,我正在查看javax.swing.JTable中的getPrintable(),但是MessageFormat没有为我提供指定页眉或页脚颜色的选项 我怎么做 澄清 我对打印时设置页眉/页脚感兴趣。例如,记事本将文件名作为标题附加到打印内容上 更新 似乎没有标准的方法,有人能给我一些解决办法吗?目前发布的唯一答案与打印页眉/页脚无关(如发送到打印机,而不是显示到屏幕) 摘自我的评论:我对打印页眉/页脚感兴趣。例如,当您从记事本打印文档时,它会

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

我怎么做

澄清 我对打印时设置页眉/页脚感兴趣。例如,记事本将文件名作为标题附加到打印内容上

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


摘自我的评论:我对打印页眉/页脚感兴趣。例如,当您从记事本打印文档时,它会将文件名附加为页眉(或者可能是页脚,我记不清了)

此代码主要来自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请告诉我您是如何使用它的:)

我能想到的一个解决方案是使用您自己的可打印文件:

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时,将其注入到自定义printable的新实例中,然后将其与PrinterJob一起使用

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

  • 您不能使用MessageFormat格式化消息。我相信您可以轻松地将此功能添加到您的可打印文件中
  • 页眉和页脚不会自动定位。不过,你可以粗略估计一下

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

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

您可以按照以下说明用Java打印PDF:

很简单:

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

如果我没弄错的话,您正在这里设置表的页眉/页脚。我对打印页眉/页脚感兴趣。例如,当您从记事本打印文档时,它会将文件名作为页眉(或者可能是页脚,我不太记得了)追加为已否决:a)与问题无关b)不安全类型转换c)不防范空列页眉渲染器d)。。。