自动/最适合JTable列,但拉伸最后一列

时间:2011-06-24 23:58:23

标签: java swing

我有以下JTable(实际上它是来自Netbeans的ETable)。它延伸到它所在的容器 - 我想保留它,而不是使用JTable.AUTO_RESIZE_OFF

enter image description here

我想以编程方式拟合它,如下所示,调整每列的大小以适应单元格内容或列标题文本,并使最右边的列填充剩余空间。我怎么能这样做?

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以关闭自动调整大小。在这种情况下,列将根据内容自动调整大小。但在这种情况下,如果总列宽小于表格的宽度,则右侧会出现空白区域。如果它更大,则会出现水平滚动条。

您可以使用TableColumn.setPreferredWidth为每列分配首选宽度。 Swing会尝试根据这个分配额外的空间。但这也无法保证。

答案 1 :(得分:0)

您必须将autoResize设置为OFF(setAutoResizeMode(JTable.AUTO_RESIZE_OFF);),但您还需要一个帮助方法来调整列的大小。

这是一个扩展JTable的自定义类,但您可以轻松引用现有的JTable:

public void resizeColumnWidth() {
    int cumulativeActual = 0;
    int padding = 15;
    for (int columnIndex = 0; columnIndex < getColumnCount(); columnIndex++) {
        int width = 50; // Min width
        TableColumn column = columnModel.getColumn(columnIndex);
        for (int row = 0; row < getRowCount(); row++) {
            TableCellRenderer renderer = getCellRenderer(row, columnIndex);
            Component comp = prepareRenderer(renderer, row, columnIndex);
            width = Math.max(comp.getPreferredSize().width + padding, width);
        }
        if (columnIndex < getColumnCount() - 1) {
            column.setPreferredWidth(width);
            cumulativeActual += column.getWidth();
        } else { //LAST COLUMN
            //Use the parent's (viewPort) width and subtract the previous columbs actual widths.
            column.setPreferredWidth((int) getParent().getSize().getWidth() - cumulativeActual);
        }
    }
}

每次添加行时都调用resizeColumnWidth()。

(可选)向表中添加一个侦听器,以便在调整表本身大小时也调整列的大小:

public MyCustomJTable() {
    super();
    addHierarchyBoundsListener(new HierarchyBoundsAdapter() {
        @Override
        public void ancestorResized(HierarchyEvent e) {
            super.ancestorResized(e);
            resizeColumnWidth();
        }
    });
    setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}