Подтвердить что ты не робот

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

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

MHekI.png

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

У меня был JPanel для компонента рендеринга ячеек, и он предпочел, чтобы размер был установлен правильно после использования prepareRenderer (...). Размер был установлен правильно после того, как содержащее окно уже было видно и перерисовывалось (2 раза на самом деле после некоторого неопределенного, хотя и короткого времени). Как я могу вызвать метод updateRowHeights(), показанный выше, и где бы я это сделал? Если я назвал это (overriden) 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 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;
    }
}