java jtable打印_java – 具有多行单元格渲染器的JTable打印非常奇怪

本文讨论了在Java中遇到的一个JTable打印问题,当使用多行单元格渲染器时,表格在打印过程中显示异常,只打印了部分内容。问题在于表格在第16页后才开始打印边框和列标题,而正常的表格在没有多行单元格渲染器时可以正确打印。作者提供了自定义的MultiLineTableCellRenderer代码,并寻求解决方案。
摘要由CSDN通过智能技术生成

我有一个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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值