Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > fireTableDataChanged сбрасывает высоту рядов


Автор: _Y_ 25.1.2011, 19:00
Вот такое явление наблюл. Почему происходит не понимаю smile 
  • Создаю таблицу JTable
  • Устанавливаю для каждого ряда свое значение высоты методом setRowHeight(row, height)
  • Красотища!
  • Програмно изменяю данные в таблице
  • Для обновления данных на экране запускаю метод модели fireTableDataChanged() (метод унаследован от AbstractTableModel)
  • Высота всех рядов возвращается к значению по умолчанию
Объясните пожалуйста почему. И как грамотно побороть подлый феномен?

Автор: COVD 25.1.2011, 19:42
fireTableDataChanged()  означает, что количество строк в модели тоже возможно поменялось, поэтому предыдущие установки высоты для каждой строки отменяются. Все логично. Придется повторить пункт "Устанавливаю для каждого ряда свое значение высоты методом setRowHeight(row, height)". Или использовать другой fire...

Автор: jk1 25.1.2011, 21:41
_Y_, 

Раз Вы устанавливаете разные значения высоты для разных строк, значит высота определяется разными данными в этих строках.
А раз так, может быть проще написать соответствующий Renderer для этих данных?

Вот тривиальный пример установки высоты по самой высокой ячейке в ряду. Ничего не мешает поместить в него какую-нибудь логику определения высоты исходя из данных в ячейке или номера столбца, или еще чего-нибудь.
Код

public Component getTableCellRendererComponent(JTable table, Object value,
                                                 boolean isSelected,
                                                 boolean hasFocus, int row,
                                                 int column) {
      int height = new Double(getPreferredSize().getHeight()).intValue();
      if (table.getRowHeight(row) < height)
          table.setRowHeight(row, height);    
      return this;
  }


Автор: _Y_ 25.1.2011, 22:44
COVD, спасибо. сделал методом fireTableRowsUpdated(0, rows - 1);

jk1, этот вариант мне не годится. Тогда все ряды подгоняются под данные. У меня же две категории рядов - внутритабличные заголовки и просто данные. Заголовки уже. Так таблица красивее получается.

Спасибо!

Автор: jk1 26.1.2011, 11:35
_Y_, 

Из чистого любопытства: что мешает внутри renderer'a понять что в данный момент мы рисуем заголовок и установить для данной ячейки требуемый размер?

Автор: COVD 26.1.2011, 15:03
Цитата

что мешает внутри renderer'a понять что в данный момент мы рисуем заголовок 

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

Но вообще, для заголовков есть header. "Внутритабличные заголовки" не позволяют делать в таблице сортировку строк, фильтрацию. Таблица должна быть однородна, отображать один тип данных. 

Автор: _Y_ 26.1.2011, 20:08
jk1, ничего не мешает. Но зачем сложности если можно просто?

Цитата(COVD @  26.1.2011,  15:03 Найти цитируемый пост)
"Внутритабличные заголовки" не позволяют делать в таблице сортировку строк, фильтрацию. Таблица должна быть однородна, отображать один тип данных. 
 Это не совсем так. Просто принцип сортировки и фильтрации становится многоступенчатым и должен быть специально описан.
----------------- 
ЗЫ: К моей задаче это не относится - ни сортировки, ни фильтрации smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)