Выравнивание формата сообщения при печати 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());
        }
    }

person DanielFH    schedule 22.02.2010    source источник


Ответы (2)


Вы можете посмотреть на это 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;
}

Приложение. Хотя этот подход работает для таблицы, которая помещается на одной странице, в этой статье описывается печать Компоненты размером более одной страницы.

person trashgod    schedule 22.02.2010
comment
Пытался заставить его работать, но безуспешно. Есть ли шанс, что у кого-нибудь есть пример кода, который было бы проще реализовать, чем приведенный выше пример CustomTablePrintable? - person DanielFH; 23.02.2010

Пробовал кое-что взад и вперед и до сих пор не может заставить что-либо работать. Я знаю, что то, что я вставил сюда, может быть немного неправильным, но это результат попыток разных вещей.

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;         
    } 
}
person DanielFH    schedule 23.02.2010