У меня есть JTable с настраиваемым рендерером ячеек для многострочных ячеек. Все в порядке, JTable хорошо отображается на экране, и я очень доволен этим, но ночью, когда я попытался просто напечатать его, у меня возникла очень странная проблема. Использование:
table.print (PrintMode.FIT_WIDTH, новый MessageFormat ("..."), новый MessageFormat ("..."));
Я видел, что таблица не печатается полностью. Затем, используя другой класс, сделанный коллегой для печати JTables, я получил тот же результат:
Таблице (с многострочными ячейками) для печати потребовалось 22 страницы. Печатный документ (который я просматривал только в формате xps, поскольку у меня нет принтера) также имел 22 страницы. Но до страницы 16 все было напечатано, как и ожидалось, и после этого были напечатаны только границы и заголовки столбцов таблицы.
Как ни странно (мне), когда я пытался напечатать таблицу с использованием другого средства визуализации ячеек, которое не допускает многострочных ячеек, таблице требовалось ровно 16 страниц, и она была напечатана полностью, хотя и была обрезана длинная ячейка.
Я искал по всей сети, но мне не повезло. Кто-нибудь знает, почему это может происходить? Есть ли решение?
Обновление:
Рендерер моей ячейки следующий:
public class MultiLineTableCellRenderer extends JTextPane implements TableCellRenderer {
private List<List<Integer>> rowColHeight = new ArrayList<List<Integer>>();
public MultiLineTableCellRenderer() {
setOpaque(true);
}
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
String s = (String)value;
if (s.equals("<περιοδάριθμος>")) {
setForeground(Color.blue);
}
else if(s.equals("<παραγραφάριθμος>")) {
setForeground(Color.red);
}
else {
setForeground(Color.black);
}
setBackground(new Color(224, 255, 255));
if (isSelected) {
setBackground(Color.GREEN);
}
setFont(table.getFont());
setFont(new Font("Tahoma", Font.PLAIN, 10));
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
if (table.isCellEditable(row, column)) {
setForeground(UIManager.getColor("Table.focusCellForeground"));
setBackground(UIManager.getColor("Table.focusCellBackground"));
}
} else {
setBorder(new EmptyBorder(1, 2, 1, 2));
}
if (value != null) {
setText(value.toString());
} else {
setText("");
}
adjustRowHeight(table, row, column);
SimpleAttributeSet bSet = new SimpleAttributeSet();
StyleConstants.setAlignment(bSet, StyleConstants.ALIGN_CENTER);
StyleConstants.setFontFamily(bSet, "Tahoma");
StyleConstants.setFontSize(bSet, 11);
StyledDocument doc = getStyledDocument();
doc.setParagraphAttributes(0, 100, bSet, true);
return this;
}
private void adjustRowHeight(JTable table, int row, int column) {
int cWidth = table.getTableHeader().getColumnModel().getColumn(column).getWidth();
setSize(new Dimension(cWidth, 1000));
int prefH = getPreferredSize().height;
while (rowColHeight.size() <= row) {
rowColHeight.add(new ArrayList<Integer>(column));
}
List<Integer> colHeights = rowColHeight.get(row);
while (colHeights.size() <= column) {
colHeights.add(0);
}
colHeights.set(column, prefH);
int maxH = prefH;
for (Integer colHeight : colHeights) {
if (colHeight > maxH) {
maxH = colHeight;
}
}
if (table.getRowHeight(row) != maxH) {
table.setRowHeight(row, maxH);
}
}
}
Кроме того, если вы протестируете следующий очень простой пример, вы заметите, что что-то ужасно неправильно с печатью, но я действительно не могу найти что!
public static void main(String[] args) throws PrinterException {
DefaultTableModel model = new DefaultTableModel();
model.addColumn("col1");
model.addColumn("col2");
model.addColumn("col3");
int i = 0;
for (i = 1; i <= 400; i++) {
String a = "" + i;
model.addRow(new Object[]{a, "2", "3"});
}
JTable tab = new JTable(model);
tab.print();
}