Синхронизация выбранных узлов в нескольких объектах JTree

Я хотел бы, чтобы несколько JTree (все с очень похожим содержимым) синхронизировали выбранные узлы (когда один и тот же узел существует в каждом дереве).

На данный момент я делаю это, добавляя TreeSelectionListener к каждому дереву и вызывая setSelectedPath для других деревьев (если getSelectedPaths не содержит пути).

Однако я видел, что это приводит к бесконечным циклам, когда каждое дерево многократно выбирает разные узлы (я не уверен, как это воспроизвести, но я видел это при перетаскивании узлов).

Кажется, нет способа установить выбранный путь без запуска прослушивателя выбора дерева, и я бы предпочел не идти по пути, пытаясь удалить прослушиватели.

Я рассматриваю возможность разделения TreeSelectionModel между деревьями, но это похоже на большую работу, учитывая размер DefaultTreeSelectionModel.

Есть ли другие способы добиться того же результата?


person SimonC    schedule 18.12.2012    source источник


Ответы (1)


Добавьте флаг isAPI. Установите флаг, когда вы программно выбираете пути в деревьях и сбрасываете его после установки пути.

В слушателях просто проверьте, является ли isAPI==true и вернитесь из слушателя.

person StanislavL    schedule 18.12.2012
comment
Первоначально я не учитывал это, поскольку вызывал setSelectionPath при вызове SwingUtilities2.invokeLater, что, как оказалось, не нужно, поскольку TreeSelectionListener всегда будет вызываться в потоке отправки событий графического интерфейса. - person SimonC; 18.12.2012