Выравнивание формата сообщения при печати JTable - PullRequest
1 голос
/ 22 февраля 2010

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

Как я могу это сделать? Я читал кое-что о переопределении метода 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());
        }
    }

Ответы [ 2 ]

3 голосов
/ 22 февраля 2010

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

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

0 голосов
/ 23 февраля 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;         
    } 
}
...