【问题标题】:Auto resizing the JTable column widths自动调整 JTable 列宽
【发布时间】:2023-03-29 23:35:01
【问题描述】:

我需要我的 JTable 自动调整其列宽以适应内容。我发现TableColumnAdjuster 类非常有用。但是有一个小问题。假设我有 5 列,它们的内容很短。在这种情况下,如果我使用自动调整器,它会根据它们的内容设置前四列的宽度,并将所有剩余空间留给最后一列。请看示例。

这里的最后一列,Balance 被赋予了所有多余的空间。但是,如果我需要将该空间留给中间列之一怎么办。在上述情况下,我需要将该空间分配给第三列name。我尝试修改TableColumnAdjuster 类的adjustColumns() 方法。但我无法让它工作。

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

【问题讨论】:

    标签: java swing jtable tablecolumn


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你可以这样做:

      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
      

      【讨论】:

        【解决方案3】:

        你可以试试下一个:

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

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

        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        

        【讨论】:

        • 这太棒了,最终使用它。我在 setPreferredColumnModel 调用之前添加了一个检查,看起来像“if(width > 300)width=300;”这修复了一些我显示非常长的数据字段的情况。我建议将其添加到答案中-您还可以提取最小/最大宽度(会产生出色的可选参数-实际上我现在要在我的代码库中这样做。)(我希望我知道当将类似的内容编辑到别人的答案中很酷时......因为它不是 CW,所以我讨厌未经许可更改内容。)
        • 嗨,@BillK 随意编辑/添加代码...如果有,请截图。 ;)
        • 我也可以以某种方式评估标题,使其文本不会被截断吗?
        • @Xerus 在上述代码的第 9 行之后添加 width = Math.max(width, table.getColumnModel().getColumn(column).getPreferredWidth()); 以评估标题。
        • 按预期完美运行!
        【解决方案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);
        

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

        【讨论】:

        • 这与所要求的相反。 “table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);”在不考虑内容长度的情况下均匀调整所有列的大小。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 2013-05-21
        • 2015-03-27
        • 2011-03-29
        相关资源
        最近更新 更多