2010-02-22 49 views
1

我正在使用它来打印出我的表格,并且它可以正常工作。但我对消息格式的布局并不满意,我希望在页脚中包含页码和日期,日期格式与表格的左侧对齐,并且页面在右侧。在打印JTable时对齐消息格式

我该怎么做?一直在阅读一些关于重写PrintTable方法的东西,但似乎从我读过的内容中看起来非常复杂。

希望你能帮助我解决这个问题,谢谢。 :)

import javax.print.attribute.HashPrintRequestAttributeSet; 
import javax.print.attribute.PrintRequestAttributeSet; 
import javax.print.attribute.standard.OrientationRequested; 
import javax.swing.JTable; 
import dk.beesys.rims.ui.WindowInventory; 


public class Print { 

    private static Print INSTANCE; 

    public static Print getInstance() { 
     if (INSTANCE == null) { 
     INSTANCE = new Print(); 
     } 
     return INSTANCE; 
    } 

private Print(){ } 

    public void printList(java.awt.event.ActionEvent ignore) { 
     String strDate = MessageFormat.format("{0,date,short} {0,time,short}", new Date()); 

     MessageFormat header = new MessageFormat("- {0} -"); 
     MessageFormat footer = new MessageFormat("Printed: " + strDate); 
     PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
     aset.add(OrientationRequested.LANDSCAPE); 

     try { 

      WindowInventory.getInstance().getTable().print(JTable.PrintMode.FIT_WIDTH, header, footer, true, aset, true); 

     } catch (java.awt.print.PrinterException e) { 
      System.err.format("Cannot print %s%n", e.getMessage()); 
     } 
    } 

回答

3

您可能会看到此CustomTablePrintable。你喂它你桌子上没有的getPrintable()结果。在您的PrinterJob中,自定义print()将为表格生成图像,然后在同一图形上下文中绘制页脚。您可以使用上下文的边界getFontMetrics()stringWidth()来确定绘制格式化字符串的位置。

附录:这里的每个页面的右下角打印灰色日期的示例:

public int print(Graphics g, PageFormat pf, int index) throws PrinterException { 
    if (index > 0) return NO_SUCH_PAGE; 
    String s = new Date().toString(); 
    Graphics2D g2d = (Graphics2D) g; 
    table.getPrintable(
     JTable.PrintMode.NORMAL, null, null).print(g2d, pf, index); 
    Rectangle r = g2d.getClipBounds(); 
    int dw = g2d.getFontMetrics().stringWidth(s); 
    int dh = g2d.getFontMetrics().getHeight(); 
    System.out.println(index + " " + r); 
    g2d.setPaint(Color.gray); 
    g2d.drawString(s, r.x + r.width - dw, r.y + r.height - dh); 
    return Printable.PAGE_EXISTS; 
} 

附录:虽然这种方法适用于适合在一个页面上的表,本文介绍的打印Components Larger Than One Page

+0

一直试图让它工作,但没有任何运气。任何人都有可能比上面的CustomTablePrintable示例更容易实现的代码示例的机会? – DanielFH 2010-02-23 08:19:39

0

现在一直在尝试一些事情,但仍然无法获得任何工作。我知道我在这里粘贴的东西可能有点(不),但这是尝试各种事情的结果。

public class CustomTablePrint implements Printable { 

private static CustomTablePrint INSTANCE = null; 

public static CustomTablePrint getInstance() { 
    if (INSTANCE == null) { 
     INSTANCE = new CustomTablePrint(); 
    } 
    return INSTANCE; 
} 

private CustomTablePrint() {} 


    @Override 


    public int print(Graphics graphics, PageFormat pageFormat, 
      int pageIndex) throws PrinterException { 
     if (pageIndex > 0) { 
      return NO_SUCH_PAGE; 
     } 
     PrinterJob job = PrinterJob.getPrinterJob(); 
     job.setPrintable(WindowInventory.getInstance().getTable().getPrintable(JTable.PrintMode.FIT_WIDTH, null, null)); 



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

     // Draw header/footer here 

     String strDate = MessageFormat.format("{0,date,short} {0,time,short}", new Date()); 
     String printed = "Printed: "; 

     graphics.drawString(printed + strDate, 10, 10); 

     PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
     aset.add(OrientationRequested.LANDSCAPE); 
     job.printDialog(aset); 

     return PAGE_EXISTS;   
    } 
}