2012-03-04 4 views
3

Я реализовал поиск множества элементов (сотен) в JList с использованием Lucene - когда кто-то вводит в поле поиска, он выполняет поиск и отображает результаты в JList. Он делает это, добавляя и удаляя элементы из базовой модели JList, когда каждый символ вводится, но этот подход блокирует пользовательский интерфейс (поскольку добавление чего-то в ListModel должно выполняться на EDT.) Поиск выполняется очень быстро, но это добавление и удаление элементов, требующих времени.Добавление большого количества элементов в ListModel без блокировки пользовательского интерфейса

Как я могу подойти к проблеме, чтобы не блокировать EDT во время модификации модели?

Длина отставания не является огромной - она ​​определенно находится в состоянии, когда ее можно использовать в данный момент, просто не так, как snappy как хотелось бы (из-за лучшего слова.) Я ожидая, что люди на менее мощных машинах, чем мои, смогут запустить программное обеспечение, хотя отсюда и интерес к сортировке проблемы.

Другие детали:

  • Я профилированный приложение, задержка, безусловно, вызвано добавлением/удалением большого количества элементов. Типичным шагом может быть то, что любое количество элементов будет добавлено или удалено, от нескольких до сотен. Например, если я ищу букву «x» в текстовом поле, большинство элементов будут удалены, так как некоторые из них содержат эту букву. Если я удалю письмо, все предметы будут добавлены снова. Если я ищу более общий термин, например, «например», то только несколько элементов могут быть удалены, так как основная часть из них содержит этот термин.

  • Я не имею прямого отношения к строкам, но они относительно простые объекты, состоящие из нескольких строк (Песня, которая будет точно составлена ​​из таких вещей, как название, автор, лирика и т. Д.), повторно всех кэшированных с использованием SoftReferences, где это возможно (так предполагают, ни один из этих объектов не создаются или уничтожаются, они не должны быть для обычного пользователя.)

+0

Сколько предметов вы добавляете или удаляете из JList за один раз на типичном шаге? Какие типы объектов добавляются в JList? Строки? Что-то более сложное? Есть ли успех при создании объекта? И вы профилировали это? –

+0

@HovercraftFullOfEels См. Обновленный ответ. – berry120

+0

Спасибо за разъяснение. В ответ я написал несколько слабых предложений. –

ответ

2

Это не может быть ответ, который вы ищете, но мне интересно, если ваш лучшим решением будет просто не добавлять сотни пунктов. Нет никакого способа, чтобы пользователь мог или хочет прокручивать это множество элементов в JList, и поэтому, возможно, ваш самый умный ход - ограничить количество добавленных предметов до разумного числа, скажем, около 20.

Я думаю, что это похоже на текстовый процессор, отображающий документ на экране или другие непосредственные «поисковые» компоненты, которые я использовал в прошлом. Если документ большой, часто все это не загружается в память, а как-то кэшируется на диск. Если у вас нет выбора, кроме как загружать множество предметов, то, возможно, вы можете взять эту часть модели «off-line», показать модальный диалог ожидания, загрузить элементы с EDT, а затем вернуть модель обратно в линию, а затем освобождая модальный диалог.

+0

Спасибо, это похоже на хороший подход к использованию в целом - я подумал об этом, но поскольку элементы в списке отсортированы в алфавитном порядке, скорее всего, пользователь может захотеть прокрутить это множество предметов, так как они разумно организованы. Возможно, какой-то вариант в этой идее, когда изначально отображаются только 20 элементов, но добавлено, если пользовательские свитки будут работать. Спасибо за предложения! – berry120

+0

@berry: добро пожаловать и удачи. Независимо от того, что происходит, пожалуйста, вернитесь к этой теме, чтобы сообщить нам, что вы в конечном итоге сделали. –

+0

Должно быть, может быть, до того, как я получу шанс сыграть! – berry120

1

Я думаю, что самый простой способ будет использовать JTable вместо JList, добавить RowFilter в JTable, то нет причин для add/remove/modify номера Items

для add/remove/modify числа Items в XxxModel на фоне есть SwingWorker

+0

SwingWorker не будет работать здесь, так как задача, которая занимает время, - это тот, который нужно выполнить на EDT. Но спасибо, я посмотрю на JTable и посмотрю, как это сравнивается! – berry120

Смежные вопросы