自动调整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); } }
如果只有第一列可以包含多行,则可以仅为该列优化上述代码。
您必须迭代每一行,获取每个元素的边界框并相应地调整高度。 在标准JTable中没有代码支持( 请参阅本文有关Java 的解决scheme … 1.3.1 = 8 * O)。
Camickr的解决scheme根本不适用于我。 我的数据模型是dynamic的,但它一直在改变。 我想所提到的解决scheme适用于静态数据,如来自一个数组。
我有单元格渲染器组件的JPanel,它使用prepareRenderer(…)后,首选大小没有正确设置。 包含的窗口已经可见并且重新绘制之后,尺寸被正确地设置(实际上在一些未指定的时间之后,虽然短时间,但是2次)。 我怎么能调用上面显示的updateRowHeights()方法,那么我在哪里可以做到这一点? 如果我调用它(覆盖)Table.paint()它显然造成无限重绘。 这花了我2天。 从字面上看。 这个解决scheme适用于我(这是我用于列的单元格渲染器):
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; } }