2012-05-15 3 views
-1

У меня очень большой JTree, и я бы хотел перемещаться по всем узлам, начиная от корня до листьев.Итерирование и изменение jtree с несколькими потоками

Мне нужно выполнить некоторую перегруппировку на основе ввода пользователем.

Например, я хочу, чтобы все узлы, чья строка пользовательских объектов начиналась с «a», была перегруппирована внутри нового узла внутри дерева.

Начальное: Root - Энн, Джон, Эндрю

После: Root - A - Энн Эндрю J - Джон

Я думал о запуске итерации и начать кучу потоков для каждый узел и синхронизировать при создании нового узла.

Любые мысли?

ответ

3

Пучок нитей ... если вы не означает, что вы собираетесь построить на фоне нового TreeModel с использованием множественного Thread с, а затем заменить весь ваш TreeModel из ваших JTree на EDT в один идти, это будет очень плохая идея.

компоненты Свинг должны быть изменены только на EDT, так что если вы собираетесь изменить порядок узлов из нескольких Thread s непосредственно на TreeModel, который помещен на ваш JTree вы, скорее всего, в конечном итоге с коррумпированными представлением вашего JTree.

0

Как сказал Робин, выполнение его непосредственно на JTree в нескольких потоках приведет к условиям гонки.

Вы можете скопировать свой TreeModel и изменить его. Но имейте в виду, что вам все равно нужно синхронизировать ваши потоки. После этого вы можете просто вызвать SwingUtilities.invokeLater и установить скопированную и измененную модель в качестве новой модели для JTree.

Еще одна идея - проанализировать данные многопоточности, создать коллекцию (threadafe) с результатами и изменить модель на EDT с результатами. Имея большое дерево и небольшие модификации, это было бы самым быстрым способом (без копирования, без полной перестройки дерева)

Подсказка. Если вы используете Java 7, посмотрите на Fork/Join-Framework. Если нет, сделайте это, тем не менее, чтобы получить эту идею. Реализация должна быть достаточно простой, в противном случае существуют реализации.

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