3

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

我该怎么做?

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

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

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

4

4 回答 4

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 类。

于 2009-05-29T09:44:25.883 回答
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 让我知道你是怎么做的 :)

于 2009-05-21T21:02:31.980 回答
0

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

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

于 2009-05-29T13:52:56.753 回答
-1

这很简单:

JTable table = new JTable();
            ((DefaultTableCellRenderer)table.getTableHeader().getColumnModel().getColumn(4).getHeaderRenderer()).setForeground(Color.ORANGE);
于 2011-04-09T08:04:16.430 回答