Есть ли способ вызвать JXTable.packAll() таким образом, чтобы не блокировать качающийся поток?
Я показываю много данных в JXTable
из проекта SwingX. После загрузки данных звоню packAll()
в таблице, но с 200 сотнями столбцов и 30000 записей это может занять 5 секунд или более. Я звоню из свинг-потока, что означает, что пользовательский интерфейс заблокирован на эти 5 секунд. Я пробовал звонить packAll
в фоновом потоке и, как я подозревал, это имеет странные побочные эффекты. После звонка packAll()
, когда я наводю указатель мыши на таблицу, все числа в таблице постоянно обновляются до разных чисел. Есть ли способ получить разумный пользовательский опыт в JXTable при упаковке столбцов такой большой таблицы.
4 ответа
Этот цикл в ColumnFactory
убивает тебя
for (int r = 0; r < getRowCount(table); r++) {
Component comp = renderer.getTableCellRendererComponent(table, table
.getValueAt(r, column), false, false, r, column);
width = Math.max(width, comp.getPreferredSize().width);
}
Вам, вероятно, следует просто установить ширину столбцов самостоятельно, или, возможно, просто загрузить одну строку, упаковать таблицу и затем загрузить остальные данные.
Джей, не знаю, какую часть ответа ты пометил как правильный, что ты имеешь в виду под "отличной идеей" - по крайней мере, немного неясно. Два предложения были:
а) сделай сам: оставь открытым вопрос о том, когда, где и как именно б) двухступенчатая загрузка, которая в конечном итоге сводится к измерению только первой загруженной строки. Что уже предусмотрено в ColumnFactory, пожалуйста, прочитайте API для getRowCount(JXTable).
Даже если ваш контекст не настолько однороден, чтобы его можно было решить с помощью простого переопределения getRowCount(), пользовательский ColumnFactory - верный путь: вы можете реализовать любую выбранную вами стратегию измерения:-)
@ z7sg: ничто не "убивает" что-либо - как вы могли заметить, прочитав api doc;-) Измерение ячеек не совсем тривиально, реализация по умолчанию не может вместить все это, поэтому ColumnFactory разработан для расширения: подкласс и приспособиться к вашим потребностям.
Ура Жанетт
200 столбцов и 30000 строк займет время для рендеринга. Я не думаю, что вы сможете сократить время ожидания, если не сделаете что-то радикальное. Лучше всего не показывать таблицу до тех пор, пока данные не будут загружены.
Вы говорите, у вас есть 200 столбцов? Ну, я сомневаюсь, что все 200 видны одновременно. Так что, если вы просто упакуете первые 10-20 столбцов? Это должно сократить время задержки на 1/10 или 1/20.
Если JXTable не позволяет вам упаковывать отдельные столбцы, вы можете попробовать использовать регулятор столбцов таблиц, который, я думаю, обеспечивает те же функциональные возможности в обычном JTable. Это позволяет упаковывать отдельные столбцы.