自动调整 JTable 中行的高度

2022-09-02 11:53:52

在JTable中,如何使某些行自动增加高度以显示内部的完整多行文本?这是它目前的显示方式:

我不想为所有行设置高度,而只想为具有多行文本的行设置高度。


答案 1

确定行高的唯一方法是渲染每个单元格以确定渲染的高度。在表中填充数据后,您可以执行以下操作:

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);
    }
}

如果只有第一列可以包含多行,则可以仅为该列优化上述代码。


答案 2

Camickr的解决方案根本不适合我。我的数据模型是动态的 - 它一直在变化。我想提到的解决方案适用于静态数据,例如来自数组。

我有JPanel用于单元格渲染器组件,使用prepRenderer(...)后,它的首选大小设置不正确。在包含窗口已经可见并进行了重新绘制之后,大小设置正确(实际上在一些未指定但很短的时间之后,进行了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;
    }
}

推荐