自动调整Jtable列以适合内容

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

我试图根据里面的数据来匹配 JTable 列宽。我的代码:

    for(int column = 0; column < gui.testsuiteInfoTable.getColumnCount(); column ++){
        int  width =0;
    for (int row = 0; row < gui.testsuiteInfoTable.getRowCount(); row++) {
         TableCellRenderer renderer = gui.testsuiteInfoTable.getCellRenderer(row, column);
         Component comp = gui.testsuiteInfoTable.prepareRenderer(renderer, row, column);
         width = Math.max (comp.getPreferredSize().width, width);
         System.out.println(width);
     }
    TableColumn col = new TableColumn();
    col = gui.testsuiteInfoTable.getColumnModel().getColumn(column);
    System.out.println(width);
    col.setWidth(width);
    gui.testsuiteInfoTable.revalidate();

    }
}

我猜尺寸是正确的,但表格列仍然具有相同的宽度!该表嵌入在 GridBagLayout 的 ScrollPane 中,这是问题所在吗?感谢您的任何建议。

java swing jtable preferredsize tablecolumn
4个回答
25
投票

这就是您所需要的:

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

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


12
投票

如果您可以使用额外的库,请尝试 Swingx (https://java.net/projects/swingx) 那里有一个 JXTable,带有方法“packAll()”,它完全符合您的要求


6
投票
col.setWidth(width);

阅读 JTable API 并点击

How to Use Tables
上的链接。在该教程中,他们使用
setPreferredWidth(...)
来建议列的宽度。

您可能还想查看表格列调整器,它可以为您完成此操作。该解决方案还可以考虑列标题的宽度。


0
投票

我想分享我的解决方案:

public class AutoResizedTable extends JTable {
    {
        setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    }

    @Override
    public void tableChanged(TableModelEvent e) {
        super.tableChanged(e);
        resizeAndRepaint();
    }

    @Override
    public void doLayout() {
        for(int column = 0; column < getColumnCount(); column ++){
            int  width = getParent().getWidth();
            for (int row = 0; row < getRowCount(); row++) {
                TableCellRenderer renderer = getCellRenderer(row, column);
                Component comp = prepareRenderer(renderer, row, column);
                width = Math.max (comp.getPreferredSize().width, width);
            }
            TableColumn col = new TableColumn();
            col = getColumnModel().getColumn(column);
            col.setPreferredWidth(width);
        }
        super.doLayout();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.