【问题标题】:Auto adjust the height of rows in a JTable自动调整 JTable 中的行高
【发布时间】:2010-12-19 12:13:24
【问题描述】:

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

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

【问题讨论】:

    标签: java swing


    【解决方案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);
        }
    }
    

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

    【讨论】:

    • 我需要一个表模型吗?
    • 我想在这里补充一点,虽然这解决了 jtable 中的可变行高,但它也解决了所需行的选择,如果在此方法之后调用,它将正确滚动视口。许多在单元格渲染器中使用行高调整的示例在填充表格后永远无法正确滚动到所需的行
    • 如果这不起作用,请不要直接调用 updateRowHeights()。相反,将其包装在 EventQueue.invokeLater() 块中。
    【解决方案2】:

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

    【讨论】:

    • 你可以像this一样动态设置RowHeight。
    • 谢谢 GAVD。哦,我试过了吗;)不幸的是,TableModelListener 的事件是表模型的事件,而不是表 GUI 的事件。在 GUI 重新绘制自身并且 GUI 组件的大小正确计算之前,它们会被提升 /long/。此时您可以强制计算尺寸(我花了 2 天时间才弄清楚),但您为什么要这样做呢?无论如何,重绘将完成这项工作。我知道这个解决方案很脏,但是 2 天后你的完美主义消退了,你知道 ;)
    • 您将永远无法使用这种方法正确滚动到所需的行
    • @misterti 如果您能提出替代解决方案,那就太好了。我看不出有什么问题,但希望你能详细说明一下,以便我能理解你的观点。
    • 正确的解决方案是接受的答案,填充表格后将能够正确滚动。在那里看到我的评论。您的解决方案不适用于可变行高,当它决定需要重绘时,您无法控制渲染器。
    【解决方案3】:

    您必须遍历每一行,获取每个元素的边界框并相应地调整高度。标准 JTable 中没有对此的代码支持(see this article for a solution for Java ... 1.3.1 =8*O)。

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 1970-01-01
      • 2015-03-27
      • 2015-07-15
      • 2023-03-29
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多