Автоматическая настройка высоты строк в JTable
В JTable, как я могу сделать несколько строк, автоматически увеличивать высоту, чтобы показать полный многострочный текст внутри? Вот как это отображается в данный момент:
![MHekI.png]()
Я не хочу устанавливать высоту для всех строк, но только для тех, у которых есть многострочный текст.
Ответы
Ответ 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;
}
}