Автоматическое изменение размера JTable с изюминкой?

Это хорошо известный autoresizer для JTable:

public JTable autoResizeColWidth(JTable table, DefaultTableModel model) {
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setModel(model);

        int margin = 5;

        for (int i = 0; i < table.getColumnCount(); i++) {
            int                     vColIndex = i;
            DefaultTableColumnModel colModel  = (DefaultTableColumnModel) table.getColumnModel();
            TableColumn             col       = colModel.getColumn(vColIndex);
            int                     width     = 0;

            // Get width of column header
            TableCellRenderer renderer = col.getHeaderRenderer();

            if (renderer == null) {
                renderer = table.getTableHeader().getDefaultRenderer();
            }

            Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0);

            width = comp.getPreferredSize().width;

            // Get maximum width of column data
            for (int r = 0; r < table.getRowCount(); r++) {
                renderer = table.getCellRenderer(r, vColIndex);
                comp     = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), false, false,
                        r, vColIndex);
                width = Math.max(width, comp.getPreferredSize().width);
            }

            // Add margin
            width += 2 * margin;

            // Set the width
            col.setPreferredWidth(width);
        }

        ((DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(
            SwingConstants.LEFT);

        // table.setAutoCreateRowSorter(true);
        table.getTableHeader().setReorderingAllowed(false);

        return table;
    }

Проблема здесь в том, что возвращаемая таблица сжимается (по ширине)

Итак, если мой компонент JTable равен 100%, возвращаемая площадь столбца может составлять только 70% (скажем)

Что делать, если мне нужно автоматическое изменение размера, учитывая исходную ширину JTable в целом. Чтобы даже после изменения размера все столбцы вписались правильно.


person n a    schedule 24.06.2010    source источник


Ответы (1)


Мне удалось улучшить приведенный выше код, чтобы учесть размер таблицы:

public static void resizeTable(JTable table) {
    int margin = 5;
    int tableWidth = 0;
    for (int i = 0; i < table.getColumnCount(); i++) {
        int vColIndex = i;
        TableColumn col = table.getColumnModel().getColumn(vColIndex);
        int width = 0;
        // Get width of column header
        TableCellRenderer renderer = col.getHeaderRenderer();
        if (renderer == null) {
            renderer = table.getTableHeader().getDefaultRenderer();
        }
        Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0);
        width = comp.getPreferredSize().width;
        // Get maximum width of column data
        for (int r = 0; r < table.getRowCount(); r++) {
            renderer = table.getCellRenderer(r, vColIndex);
            comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), false, false,
                    r, vColIndex);
            width = Math.max(width, comp.getPreferredSize().width);
        }
        // Add margin
        width += 2 * margin;
        // Set the width
        col.setPreferredWidth(width);
        tableWidth += width;
    }

    if (tableWidth < table.getParent().getWidth()) {
        tableWidth = table.getParent().getWidth();
        for (int i = 0; i < table.getColumnCount(); i++) {
            int vColIndex = i;
            TableColumn col = table.getColumnModel().getColumn(vColIndex);
            int width = 0;
            // Get width of column header
            TableCellRenderer renderer = col.getHeaderRenderer();
            if (renderer == null) {
                renderer = table.getTableHeader().getDefaultRenderer();
            }
            Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0);
            width = comp.getPreferredSize().width;
            // Get maximum width of column data
            for (int r = 0; r < table.getRowCount(); r++) {
                renderer = table.getCellRenderer(r, vColIndex);
                comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), false, false,
                        r, vColIndex);
                width = Math.max(width, comp.getPreferredSize().width);
            }
            // Add margin
            width += 2 * margin;

            // Set the width based on table width
            if (width < tableWidth / (table.getColumnCount() - i)) {
                width = tableWidth / (table.getColumnCount() - i);
            }
            tableWidth -= width;
            col.setPreferredWidth(width);
        }
    }
}

Обратите внимание, что цикл в табличных данных выполняется дважды. Кроме того, я предпочитаю, чтобы функция не зависела от экземпляра JTable, чтобы иметь возможность вызывать ее из любого JTable в моих проектах.

person Jack Paploise    schedule 25.03.2011