自动调整 JTable 列宽

问题描述 投票:0回答:7

我需要 JTable 自动调整其列宽以适应内容。我发现

TableColumnAdjuster
课程非常有用。但有一个小问题。假设我有 5 栏,内容很短。在这种情况下,如果我使用自动调整器,它会根据内容设置前四列的宽度,并将所有其余空间分配给最后一列。请参阅示例。

enter image description here

这里最后一列,

Balance
给出了所有多余的空间。但是,如果我需要为中间的一列提供该空间怎么办?在上面的情况下,我需要将该空间分配给第三列,
name
。我尝试修改
TableColumnAdjuster
类的
adjustColumns()
方法。但我无法让它工作。

我尝试了

column.setPreferredWidth()
column.setWidth()
来更改列大小。但似乎并没有改变什么。如何有效地更改
JTable
的列大小。如果有其他替代方案或直接解决我的主要问题,那就更好了。谢谢!

java swing jtable tablecolumn
7个回答
77
投票

您可以尝试下一个:

public void resizeColumnWidth(JTable table) {
    final TableColumnModel columnModel = table.getColumnModel();
    for (int column = 0; column < table.getColumnCount(); column++) {
        int width = 15; // Min width
        for (int row = 0; row < table.getRowCount(); row++) {
            TableCellRenderer renderer = table.getCellRenderer(row, column);
            Component comp = table.prepareRenderer(renderer, row, column);
            width = Math.max(comp.getPreferredSize().width +1 , width);
        }
        if(width > 300)
            width=300;
        columnModel.getColumn(column).setPreferredWidth(width);
    }
}

JTable

这需要在resize方法之前执行。
如果你有:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

JTable


4
投票

没有选项可以自动调整一列的大小使其大于另一列。

也许你可以这样做:

tca = new TableColumnAdjuster( table, 0 );
tca.adjustColumns();
TableColumnModel tcm = table.getColumnModel();  
TableColumn tc = tcm.getColumn(1);
tc.setWidth(tc.getWidth() + 25);

这将允许您向第 1 列添加额外的空间。此额外的空间只会在第一次显示表格时添加。

另一种选择是使用:

table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

这将为每列按比例分配额外空间。


4
投票

setAutoResizeMode() 将告诉您的表格如何调整大小,您应该尝试一下所有可用的不同选项以查看差异,在我的情况下,我想专门调整两列的大小,并让它决定如何调整所有其他列.

jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
TableColumnModel colModel=jTable1.getColumnModel();
colModel.getColumn(1).setPreferredWidth(25);    
colModel.getColumn(2).setPreferredWidth(400);

2
投票

Paul Vargas 的答案稍作修改,您还可以考虑列标题大小:

public static void resizeColumnWidth(JTable table) {
    final TableColumnModel columnModel = table.getColumnModel();
    for (int column = 0; column < table.getColumnCount(); column++) {
        // Account for header size
        double width = table.getTableHeader().getHeaderRect(column).getWidth();
        for (int row = 0; row < table.getRowCount(); row++) {
            TableCellRenderer renderer = table.getCellRenderer(row, column);
            Component comp = table.prepareRenderer(renderer, row, column);
            width = Math.max(comp.getPreferredSize().width + 1, width);
        }
        if (width > 300)
            width = 300;
        columnModel.getColumn(column).setPreferredWidth((int) width);
    }
}

0
投票

你可以这样做:

JPanel jp = new JPanel();
jp.add(table);

jp.setLayout(new GridLayout(1,1)); /* little trick ;) and believe me that this step is important to the automatic all columns resize! A import is also needed for using GridLayout*/
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); // this is obvius part

0
投票

Paul Vargas 的答案稍作修改,您还可以考虑列标题的内容:

public static void resizeColumnWidth(JTable table)
{
      TableCellRenderer renderer;
      TableColumn column;
      Component component;
      Object header;
      int rowIndex, minWidth, width;

      column = table.
         getColumnModel().
         getColumn(colIndex);

      renderer = table.
         getTableHeader().
         getDefaultRenderer();

      header    = column.getHeaderValue();
      component = renderer.getTableCellRendererComponent(table, header, false, false, -1, colIndex);
      width     = component.getPreferredSize().width;
      minWidth  = Math.max(width, 0);

      for (rowIndex = table.getRowCount(); --rowIndex >= 0; )
      {
         renderer  = table.getCellRenderer(rowIndex, colIndex);
         component = table.prepareRenderer(renderer, rowIndex, colIndex);
         width     = component.getPreferredSize().width;
         minWidth  = Math.max(minWidth, width);
      }

      column.setPreferredWidth(minWidth);
    }

注意:这与 Cardinal System 的答案 不同,因为此代码考虑了标头的内容,而 Cardinal System 的答案只考虑了标头的大小。


0
投票

如果您还想考虑列标题的内容,请使用:

  private static void resizeColumnWidth(JTable table, int min, int max) {
    for (int col=0; col<table.getColumnCount(); col++) {
      TableColumn tbColumn = table.getColumnModel().getColumn(col);
      TableCellRenderer renderer = tbColumn.getHeaderRenderer();
      if (renderer == null)
        renderer = table.getTableHeader().getDefaultRenderer();
      int width = Math.max(min, renderer.getTableCellRendererComponent(table,
          tbColumn.getHeaderValue(), false, false, -1, col).getPreferredSize().width);
      for (int row=0; row<table.getRowCount() && width<max; row++) {
        Component comp = table.prepareRenderer(table.getCellRenderer(row, col), row, col);
        width = Math.max(width, comp.getPreferredSize().width);
      }
      tbColumn.setPreferredWidth(Math.min(width, max));
    }
  }

为了获得更好的性能,当达到

max
时,它也会停止内部 for 循环。

© www.soinside.com 2019 - 2024. All rights reserved.