JTable 设置具有动态大小的列宽和 JTextArea 作为单元格渲染器

JTable set column width with a dynamic size and JTextArea as cell renderer

我想根据文本设置动态大小的 JTable 列。我想知道我设置为 getColumnModel().getColumn(0).setWidth(X); 的每个 X 数字可以容纳多少个字符? (字体为 Arial 字体大小为 12

I want to know for each X number I set to getColumnModel().getColumn(0).setWidth(X); how many characters can fit in?

您无法获得一般答案,因为字符串 "iiiii" 将占用少于 "wwwww",因为每个字符占用的像素数不同。

相反,您实际上需要单独确定每个单元格的大小,然后使用最大值。您将在数据加载到 table 后执行此操作。

基本代码为:

JTable table = new JTable( ... );
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );

for (int column = 0; column < table.getColumnCount(); column++)
{
    TableColumn tableColumn = table.getColumnModel().getColumn(column);
    int preferredWidth = tableColumn.getMinWidth();
    int maxWidth = tableColumn.getMaxWidth();

    for (int row = 0; row < table.getRowCount(); row++)
    {
        TableCellRenderer cellRenderer = table.getCellRenderer(row, column);
        Component c = table.prepareRenderer(cellRenderer, row, column);
        int width = c.getPreferredSize().width + table.getIntercellSpacing().width;
        preferredWidth = Math.max(preferredWidth, width);

        //  We've exceeded the maximum width, no need to check other rows

        if (preferredWidth >= maxWidth)
        {
            preferredWidth = maxWidth;
            break;
        }
    }

    tableColumn.setPreferredWidth( preferredWidth );
}

以上代码将为每列提供一个静态宽度。

另一种选择是使用Table Column AdjusterTable Column Adjuster 将上述逻辑与附加功能结合在一起,可用于确定列宽:

  1. 基于 header、每个单元格或两者中的数据
  2. 静态(在数据加载到 TableModel 之后)或动态(当数据被编辑或添加到 TableModel 时)。

这就是您所需要的:

JTable table = new JTable(){
    @Override
       public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
           Component component = super.prepareRenderer(renderer, row, column);
           int rendererWidth = component.getPreferredSize().width;
           TableColumn tableColumn = getColumnModel().getColumn(column);
           tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
           return component;
        }
    };
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

table 将自动调整每个列的宽度以适应内容。无需控制何时触发调整大小。