Автоматическая настройка высоты строк в JTable

В JTable, как я могу заставить некоторые строки автоматически увеличивать высоту, чтобы показать весь многострочный текст внутри? Вот как это отображается в данный момент:

Я не хочу устанавливать высоту для всех строк, но только для тех, которые имеют многострочный текст.

3 ответа

Решение

Единственный способ точно узнать высоту строки - визуализировать каждую ячейку, чтобы определить высоту визуализации. После того, как ваша таблица заполнена данными, вы можете сделать:

private void updateRowHeights()
{
    for (int row = 0; row < table.getRowCount(); row++)
    {
        int rowHeight = table.getRowHeight();

        for (int column = 0; column < table.getColumnCount(); column++)
        {
            Component comp = table.prepareRenderer(table.getCellRenderer(row, column), row, column);
            rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
        }

        table.setRowHeight(row, rowHeight);
    }
}

Если только первый столбец может содержать несколько строк, вы можете оптимизировать приведенный выше код только для этого столбца.

Решение Камикра не работает для меня вообще. Моя модель данных была динамичной - она ​​постоянно менялась. Я думаю, что упомянутое решение работает для статических данных, например, из массива.

У меня был JPanel для компонента визуализации ячеек, и его предпочтительный размер не был установлен правильно после использования prepareRenderer (...). Размер был установлен правильно после того, как содержащее окно было уже видимым и перекрашивалось (фактически 2 раза после некоторого неуказанного, хотя и короткого времени). Как я могу вызвать метод updateRowHeights(), показанный выше, и где я могу это сделать? Если я вызвал его в (переопределить) Table.paint(), это, очевидно, вызвало бесконечные перерисовки. Это заняло у меня 2 дня. В прямом смысле. Решение, которое работает для меня, вот это (это средство визуализации ячеек, которое я использовал для своей колонки):

public class GlasscubesMessagesTableCellRenderer extends MyJPanelComponent implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {
        //this method updates GUI components of my JPanel based on the model data
        updateData(value);
        //this sets the component's width to the column width (therwise my JPanel would not properly fill the width - I am not sure if you want this)
        setSize(table.getColumnModel().getColumn(column).getWidth(), (int) getPreferredSize().getHeight());

        //I used to have revalidate() call here, but it has proven redundant

        int height = getHeight();
        // the only thing that prevents infinite cell repaints is this
        // condition
        if (table.getRowHeight(row) != height){
            table.setRowHeight(row, height);
        }
        return this;
    }
}

Вы должны выполнить итерацию по каждой строке, получить ограничивающую рамку для каждого элемента и соответственно отрегулировать высоту. В стандарте JTable для этого нет поддержки кода ( см. Эту статью для решения для Java ... 1.3.1 =8*O).

Другие вопросы по тегам