Есть ли способ вызвать JXTable.packAll () таким образом, чтобы не блокировать качающийся поток? - PullRequest
2 голосов
/ 17 марта 2011

Я показываю много данных в JXTable из проекта SwingX . После загрузки данных я вызываю packAll() для таблицы, но с 200 сотнями столбцов и 30 000 записей это может занять 5 секунд или больше. Я звоню из свинговой ветки, что означает, что пользовательский интерфейс заблокирован на эти 5 секунд. Я попытался вызвать packAll в фоновом потоке, и, как я подозревал, это вызвало странные побочные эффекты. После вызова packAll() при наведении курсора мыши на таблицу все числа в таблице постоянно обновляются на разные номера. Есть ли способ, с помощью которого я могу получить разумный опыт работы с пользователем в JXTable при упаковке столбцов такой большой таблицы.

Ответы [ 4 ]

4 голосов
/ 17 марта 2011

Этот цикл в 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);
}

Вы, вероятно, должны просто установить ширину столбцов самостоятельно или, возможно, просто загрузить одну строку, упаковать таблицу и затем загрузить остальные данные,

2 голосов
/ 23 марта 2011

Джей, не знаю, какую часть ответа вы отметили как правильную, что вы подразумеваете под «отличной идеей» - по крайней мере, немного неясно.Два предложения были:

а) сделать это самостоятельно: оставить открытым вопрос о том, когда, где и как именно б) двухступенчатая загрузка, которая в конечном итоге сводится к измерению только первой загруженной строки.Что уже предусмотрено в ColumnFactory, пожалуйста, прочитайте API для getRowCount (JXTable).

Даже если ваш контекст не настолько однороден, чтобы его можно было решить с помощью простого переопределения getRowCount (), пользовательский ColumnFactory - это путь: вы можете реализовать любую выбранную вами стратегию измерения: -)

@ z7sg: ничто не «убивает» ничего - как вы могли заметить, прочитав api doc ;-) Измерение ячеек не совсем тривиально, реализация по умолчанию не может вместить все это, поэтому ColumnFactory разработан для расширения: подкласс и адаптироваться к вашим потребностям.

Ура Жанетт

1 голос
/ 17 марта 2011

Вы говорите, у вас есть 200 столбцов? Ну, я сомневаюсь, что все 200 видны одновременно. Так что, если вы просто упакуете первые 10-20 столбцов? Это должно сократить время задержки на 1/10 или 1/20.

Если JXTable не позволяет вам упаковывать отдельные столбцы, то вы можете попробовать использовать Настольный регулятор столбцов , который, я думаю, обеспечивает те же функции в обычном JTable. Позволяет упаковывать отдельные столбцы.

1 голос
/ 17 марта 2011

200 столбцов и 30 000 строк - рендеринг займет некоторое время. Я не думаю, что вы сможете сократить время ожидания, если вы не сделаете что-то радикальное. Лучше всего не показывать таблицу до тех пор, пока данные не будут загружены.

...