Печать верхних и нижних колонтитулов в цвете? - PullRequest
2 голосов
/ 21 мая 2009

Я пытаюсь создать цветные верхние и нижние колонтитулы при печати JTable. В частности, я смотрю на getPrintable () в javax.swing.JTable, но MessageFormat не дает мне возможности указать цвет верхнего или нижнего колонтитула.

Как я могу это сделать?

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

обновление Кажется, что нет стандартного способа сделать это, кто-то может дать мне несколько обходных путей? Единственный ответ, опубликованный до сих пор, не имеет отношения к печати (как при отправке на принтер, а не на экран) верхних / нижних колонтитулов.

Скопировано из моего комментария: меня интересует верхний / нижний колонтитул печати. Например, когда вы печатаете документ из блокнота, он добавляет имя файла в качестве заголовка (или, возможно, его нижний колонтитул, я точно не помню)

Ответы [ 4 ]

3 голосов
/ 29 мая 2009

Единственное решение, которое я могу придумать, - это использовать собственную печатную форму:

public class CustomTablePrintable implements Printable {

    Printable tablePrintable;

    public void setTablePrintable(Printable printable) {
        tablePrintable = printable;        
    }

    public int print(Graphics graphics, PageFormat pageFormat, 
            int pageIndex) throws PrinterException {
        if (pageIndex > 0) {
            return NO_SUCH_PAGE;
        }

        tablePrintable.print(graphics, pageFormat, pageIndex);

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

        // Draw header/footer here
        graphics.drawString(header, posx, posy);

        return PAGE_EXISTS;        
    }
}

Когда вы вызываете getPrintable из JTable, вставьте его в новый экземпляр для пользовательской печати, а затем используйте его с PrinterJob.

Теперь вы можете нарисовать верхний и нижний колонтитулы по своему желанию, но вы также потеряете некоторые вещи:

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

РЕДАКТИРОВАТЬ: Я посмотрел на источники Java, и есть закрытый класс TablePrintable, который делает всю работу. Вы можете просмотреть исходный код, чтобы увидеть, как печатаются верхний и нижний колонтитулы. Затем вы можете переместить эту функцию в свой класс Printable.

0 голосов
/ 09 апреля 2011

Это просто:

JTable table = new JTable();
            ((DefaultTableCellRenderer)table.getTableHeader().getColumnModel().getColumn(4).getHeaderRenderer()).setForeground(Color.ORANGE);
0 голосов
/ 29 мая 2009

Это немного за пределами левого поля, но вы можете использовать библиотеку типа iText для создания PDF-документа, а затем отправить его на принтер. Вы получите гораздо больший уровень контроля над внешним видом и представлением документа, включая возможность управлять тем, как строки вашей таблицы выходят за границы страниц, и вы сможете очень легко устанавливать верхний и нижний колонтитулы страницы .

Вы можете распечатать PDF на Java, следуя этим инструкциям: http://www.juixe.com/techknow/index.php/2008/01/17/print-a-pdf-document-in-java/

0 голосов
/ 22 мая 2009

Этот код в основном из www.java2s.com с изменениями, чтобы показать, как изменить цвет. Это не самое красивое решение, но, надеюсь, поможет вам.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class MainClass {
  public static void main(String args[]) {
    String rows[][] = { { "A", "a" }, { "B", "b" }, { "E", "e" } };
    String headers[] = { "Upper", "Lower" };

    JFrame frame = new JFrame("Label Header");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTable table = new JTable(rows, headers);
    JScrollPane scrollPane = new JScrollPane(table);

    Border headerBorder = UIManager.getBorder("TableHeader.cellBorder");

    JLabel headerLabel1 = new JLabel(headers[0], JLabel.CENTER);
    headerLabel1.setBorder(headerBorder);

    // Here is where the color is changed.
    headerLabel1.setBackground(new Color(255, 0, 0));
    headerLabel1.setForeground(new Color(0, 0, 255));
    // End of color change.

    JLabel headerLabel2 = new JLabel(headers[1], JLabel.CENTER);
    headerLabel2.setBorder(headerBorder);

    TableCellRenderer renderer = new JComponentTableCellRenderer();

    TableColumnModel columnModel = table.getColumnModel();

    TableColumn column0 = columnModel.getColumn(0);
    TableColumn column1 = columnModel.getColumn(1);

    column0.setHeaderRenderer(renderer);
    column0.setHeaderValue(headerLabel1);

    column1.setHeaderRenderer(renderer);
    column1.setHeaderValue(headerLabel2);

    frame.add(scrollPane, BorderLayout.CENTER);
    frame.setSize(300, 150);
    frame.setVisible(true);
  }
}

class JComponentTableCellRenderer implements TableCellRenderer {
  public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) {
    return (JComponent)value;
  }
}

Самый важный бит:

    // Here is where the color is changed.
    headerLabel1.setBackground(new Color(255, 0, 0));
    headerLabel1.setForeground(new Color(0, 0, 255));
    // End of color change.

HTH, дай мне знать, как ты с этим справился :)

...