我有一个JTable,带有一个用于多行单元的自定义单元格渲染器.一切都还可以,JTable在屏幕上画得很好,我很高兴,但是当我试图简单地打印它时,我想出了一个非常奇怪的问题.使用:
table.print(PrintMode.FIT_WIDTH,new MessageFormat(“…”),new MessageFormat(“…”));
我看到桌子没有完全打印.然后使用同事制作的另一个类来打印JTables,我得到了相同的结果:
该表(带有多行单元格)需要22页才能打印.打印文档(我只用xps格式查看,因为我没有打印机)也有22页.但是直到第16页,所有内容都按预期打印,之后只打印了表格的边框和列标题.
奇怪的是(对我来说),当我尝试使用另一个不允许多行单元格的单元格渲染器打印表格时,表格需要16页并完全打印,尽管在冗长的单元格值中进行裁剪.
我在网上搜索但我没有运气.有人知道为什么会这样吗?有解决方案吗?
更新:
我的单元格渲染器如下:
public class MultiLineTableCellRenderer extends JTextPane implements TableCellRenderer {
private List> rowColHeight = new ArrayList>();
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(column));
}
List 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();
}