Есть ли способ вызвать JXTable.packAll() таким образом, чтобы не блокировать поток swing?
-
27-10-2019 - |
Вопрос
Я отображаю большое количество данных в JXTable
из самого SwingX ( Свингкс ) проект.После загрузки данных я вызываю packAll()
в таблице, но с 200 сотнями столбцов и 30 000 записями, это может занять 5 секунд или больше.Я вызываю это из потока swing, что означает, что пользовательский интерфейс заблокирован на эти 5 секунд.Я пытался дозвониться packAll
в фоновом потоке, и, как я и подозревал, это имеет нечетные побочные эффекты.После звонка packAll()
, когда я навожу курсор мыши на таблицу, кажется, что все числа в таблице постоянно обновляются до разных чисел.Есть ли какой-либо способ, которым я могу получить разумный пользовательский опыт работы с JXTable при упаковке столбцов такой большой таблицы?
Решение
Эта петля в 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);
}
Вы, вероятно, должны просто установить ширину столбца самостоятельно или, возможно, просто загрузить одну строку, упаковать таблицу, а затем загрузить остальные данные.
Другие советы
Джей, не знаю, какую часть ответа вы отметили как правильный, вы имеете в виду с «отличной идеей» - по крайней мере, немного неясно. Два предложения были:
а) Сделайте это самостоятельно: листья открывают вопрос о том, когда и где и как именно б) двухэтапная загрузка, что в конечном итоге сводится к измерению только первой загруженной строки. Который уже предусмотрен в ColoonFactory, пожалуйста, прочитайте DOC API для getRowCount (jxtable).
Даже если ваш контекст не такой равномерный, как решать простым переопределением getRowCount (), настраиваемое ColumnFactory-это путь: вы можете реализовать любую измерение, которую вы выберете :-)
@Z7SG: ничего не «убивает» ничего - как вы могли заметить Приспособитесь к вашим потребностям.
Ура, Джанетт
200 столбцов и 30 000 рядов займут минутку для визуализации. Я не думаю, что вы сможете устранить время ожидания, если вы не сделаете что -то радикальное. Лучше всего может быть не показывать таблицу, пока данные не будут загружены.
Вы говорите, у вас есть 200 колонок?Ну, я сомневаюсь, что все 200 видны одновременно.Ну и что, если вы просто упакуете первые 10-20 столбцов?Это должно сократить время задержки на 1/10 или 1/20.
Если JXTable не позволяет вам упаковывать отдельные столбцы, вы можете попробовать использовать Регулятор столбцов таблицы который, я думаю, обеспечивает ту же функциональность в обычной JTable.Это позволяет вам упаковывать отдельные столбцы.