Получение строки или TreePath узла JTree, которого нет в области просмотра - PullRequest
0 голосов
/ 19 декабря 2010

У меня есть JTree и пользовательский рендер.

JTree - это дерево IP-адресов по номеру коммутатора и порта.

У меня есть график IP-адресов.

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

Если ip, выбранный щелчком мыши пользователя на графике, средство визуализации содержит этоузел и другие действия выполняются легко, потому что доступны строка и TreePath.

Если список IP-адресов велик, а некоторые прокручиваются из области просмотра, у меня возникла проблема с определением, для чего предназначена строка или триодобъект / ip, который я хочу выбрать и показать в окне просмотра.

У меня есть ActionEvent в JTree, который получает часть текста, который составляет текст узлов, возвращенный из getUserObject ().

Я не знаю, как найти строку или TreeNode.Если бы я мог их найти, я мог бы проверить, видима ли строка и, если нет, вызвать makeVisible (treePath) - или использовать scrollPane.getViewport (). GetViewRect () и сравнить его с прямоугольником treeNode.

Спасибодля любых советов или направлений ... Джим

Ответы [ 2 ]

0 голосов
/ 21 декабря 2010

Я нашел лучший метод для работы с JTree.

Вышеприведенный метод работает нормально для JLists.

Поскольку у меня есть карта строк, учитывая номер строки, существует JTreeконкретный вызов Компонента.

            scrollRowToVisible( row );

и код становится

    if ( ipRowMap.containsKey( ip )) {
        row = ipRowMap.get( ip ); 
        scrollRowToVisible( row );
    }
0 голосов
/ 19 декабря 2010

Я решил проблему следующим образом.

После расширения всех узлов я заполняю хэш-карту, в которой ключом является ip, а строкой - значение.

Когда я получаю событиесодержащий ip, я смотрю строку в hasmap.

Это работает независимо от того, находится узел / строка в окне просмотра или нет.

следующим образом:

        if ( ipRowMap.containsKey( ip )) {
            row = ipRowMap.get( ip ); 
            TreePath tp = getPathForRow( row );
            Rectangle rtp = this.getPathBounds( tp );
            Rectangle rsp = scrollPane.getViewport().getViewRect();
            if ( !rtp.intersects( rsp)) {
                scrollPane.getViewport().scrollRectToVisible( rtp );
            }
        }

Это работает в первый раз, но не каждый раз.

Но это будет новый пост, если я не смогу решить эту проблему.Я думаю, что область прокрутки или область просмотра изменилась так, как я не обрабатываю.

...