2010-02-22 1 views
1

현재 테이블을 인쇄 할 때이 기능을 사용하고 있습니다. 하지만 메시지 서식의 레이아웃에별로 만족스럽지 않습니다. 바닥 글에 pagenumber와 날짜가 모두 있고 테이블의 왼쪽에 날짜 서식이 정렬되어 있고 오른쪽에 페이지가 있습니다.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

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;   
    } 
}