【发布时间】:2010-12-19 12:13:24
【问题描述】:
在 JTable 中,如何使某些行自动增加高度以显示完整的多行文本?这是它现在的显示方式:
我不想为所有行设置高度,但只为具有多行文本的行设置高度。
【问题讨论】:
在 JTable 中,如何使某些行自动增加高度以显示完整的多行文本?这是它现在的显示方式:
我不想为所有行设置高度,但只为具有多行文本的行设置高度。
【问题讨论】:
确定行高的唯一方法是渲染每个单元格以确定渲染高度。用数据填充表格后,您可以执行以下操作:
private void updateRowHeights()
{
for (int row = 0; row < table.getRowCount(); row++)
{
int rowHeight = table.getRowHeight();
for (int column = 0; column < table.getColumnCount(); column++)
{
Component comp = table.prepareRenderer(table.getCellRenderer(row, column), row, column);
rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
}
table.setRowHeight(row, rowHeight);
}
}
如果只有第一列可以包含多行,您可以仅针对该列优化上述代码。
【讨论】:
Camickr 的解决方案根本不适合我。我的数据模型是动态的——它一直在变化。我猜上述解决方案适用于静态数据,例如来自数组。
我有用于单元格渲染器组件的 JPanel,但在使用 prepareRenderer(...) 后,它的首选大小设置不正确。在包含窗口已经可见并重新绘制之后,大小被正确设置(实际上是在一些未指定的时间之后,虽然时间很短,但实际上是 2 次)。我如何调用上面显示的 updateRowHeights() 方法,我将在哪里执行此操作?如果我在(覆盖)Table.paint() 中调用它,它显然会导致无限重绘。我花了2天时间。字面上地。适合我的解决方案是这个(这是我用于列的单元格渲染器):
public class GlasscubesMessagesTableCellRenderer extends MyJPanelComponent implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
//this method updates GUI components of my JPanel based on the model data
updateData(value);
//this sets the component's width to the column width (therwise my JPanel would not properly fill the width - I am not sure if you want this)
setSize(table.getColumnModel().getColumn(column).getWidth(), (int) getPreferredSize().getHeight());
//I used to have revalidate() call here, but it has proven redundant
int height = getHeight();
// the only thing that prevents infinite cell repaints is this
// condition
if (table.getRowHeight(row) != height){
table.setRowHeight(row, height);
}
return this;
}
}
【讨论】:
您必须遍历每一行,获取每个元素的边界框并相应地调整高度。标准 JTable 中没有对此的代码支持(see this article for a solution for Java ... 1.3.1 =8*O)。
【讨论】: