1

私は今のところこれを使ってテーブルを印刷していますが、うまくいきます。しかし、メッセージフォーマットのレイアウトにはあまり満足していません。フッターにページ番号と日付の両方を配置し、日付形式を表の左側に、ページを右側に配置したいと考えています。

どうやってやるの?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());
        }
    }
4

2 に答える 2

3

あなたはこれを見るかもしれませんCustomTablePrintablegetPrintable()テーブルの装飾されていない結果をフィードします。では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;
}

補遺: このアプローチは 1 ページに収まる表に対しては機能しますが、この記事では、1 ページよりも大きいコンポーネントの印刷について説明します。

于 2010-02-22T19:12:39.077 に答える
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;         
    } 
}
于 2010-02-23T10:51:50.447 に答える