2009-05-21 4 views
2

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

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

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

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

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

ответ

3

Одно решение, которое я могу думать о том, чтобы использовать свой собственный для печати:

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, добавьте его в новый экземпляр для пользовательской печати и th en используйте это с PrinterJob.

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

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

EDIT: Я посмотрел на источники Java и есть класс TablePrintable частный, который делает всю работу. Вы можете пик в исходном коде, чтобы увидеть, как печатаются верхний и нижний колонтитулы. Затем вы можете перенести эту функциональность в свой класс Printable.

+0

выглядит хорошо. Я дам это попробовать. –

0

Этот код главным образом находится на сайте 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. 

НТН, дайте мне знать, как вы получили с ней :)

+0

Если я не ошибаюсь, вы настраиваете заголовок таблицы/колонтитулы здесь. Меня интересует печатный заголовок/нижний колонтитул. Например, когда вы печатаете документ из блокнота, он добавляет имя файла в виде заголовка (или, возможно, его нижнего колонтитула, я точно не помню) –

0

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

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

-1

Это легко:

JTable table = new JTable(); 
      ((DefaultTableCellRenderer)table.getTableHeader().getColumnModel().getColumn(4).getHeaderRenderer()).setForeground(Color.ORANGE); 
+2

downvoted: a) не связанный с вопрос b) небезопасный тип-литье c) неохраняемый против обработчика заголовка нулевого столбца d) ... – kleopatra

 Смежные вопросы

  • Нет связанных вопросов^_^