Автоматическая настройка высоты строк в 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).