JTable使用动态大小设置列宽,将JTextArea设置为单元格渲染器

时间:2015-05-20 14:05:48

标签: java swing jtable

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

2 个答案:

答案 0 :(得分:2)

  

我想知道每个X编号我设置为getColumnModel()。getColumn(0).setWidth(X);可以容纳多少个字符?

你无法得到一般答案,因为字符串“iiiii”将小于“wwwww”,因为每个字符可以采用不同数量的像素。

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

基本代码是:

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. 基于标题中的数据,每个单元格或两者
  2. 静态地(在数据加载到TableModel之后)或动态地(当数据被编辑或添加到TableModel时)。

答案 1 :(得分:1)

这就是你所需要的:

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

该表将自动调整每个列宽以适合内容。无需控制何时触发调整大小。