Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Tree1.getSelectionPath(); 
:(
    Опции темы
Up
Дата 13.9.2004, 06:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Проблема в следующем.
Запоминаем путь к ноду

sel_row=jTree1.getSelectionPath();

затем при необходимости возвращаемся к нему

jTree1.setSelectionPath(sel_row);

Все хорошо.. возвращаемся к ноду, если он скрыт, то дерево открывается с выделением данного нода.

Но дерево строится по данным из БД, поэтому приходится полностью перерисовывать дерево.
В этом случае при

jTree1.setSelectionPath(sel_row);

данный нод выделяется (можно увидеть только программно), но дерево не переходит к нему (не раскрывается в нужном месте)

При перепостроении дерева данный путь (запоминаемый) не меняется.

Как возможно решить данную проблему?

Спасибо.
  Вверх
AntonSaburov
Дата 13.9.2004, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 118



Думаю, что надо искать нужный узел так:
1. Сами объекты дерева должны иметь некий уникальный ID
2. Запомнинать этот ID при перемещении на узел.
3. После перестроения дерева рекурсивно обегая дерево находить нужный объект и делать его видимым.

А твой вариант не сработает - там же ссылки и ищет он по старой ссылке, которой после перестройки дерева уже, увы, нет.
PM MAIL WWW ICQ   Вверх
Up
Дата 13.9.2004, 14:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











AntonSaburov
Спасибо, так и буду делать.
  Вверх
AntonSaburov
Дата 13.9.2004, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 118



Цитата(Up @ 13.9.2004, 15:52)
Спасибо, так и буду делать.

Да не за что. Мы всегда рады, когда к нам приходят новые люди. Так что если будет желание и возможность - региструйтесь и становитесь нашим полноправным участником. Будем рады. У нас тут теплая компания biggrin.gif
PM MAIL WWW ICQ   Вверх
Upir
Дата 13.9.2004, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 13.9.2004

Репутация: нет
Всего: нет



Уже так и сделал ) wink.gif
PM MAIL   Вверх
Foo
Дата 3.1.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 20.10.2006

Репутация: 2
Всего: 3



возникла и у меня такая проблема, вот так примерно решил:

Код

public void setSelectedNode(TreeDataNode node)
    {
        List<TreeDataNode> path = new ArrayList<TreeDataNode>();
        while(node != null){
            path.add(0, node);
            node = getParent(node);
        }
        tree.setSelectionPath(new TreePath(path.toArray()));
    }
    
    /**
     * метод рекурсивно обходит дерево в поисках нода с id, таким же как у последнего выделенного нода, и делает его селектнутым
     * @param id
     * @param node
     */
    public void setSelectedNodeByDTOId(Long id, TreeDataNode node){
        if (node.getDto().getId().equals(id)) {
            setSelectedNode(node);
        }else{
            Collection<TreeDataNode> c = new ArrayList<TreeDataNode>();
            c = node.getChilds();
            for (TreeDataNode nod : c){
                setSelectedNodeByDTOId(id,nod);
            }
        }
    }


но возникла проблема другого рода. У меня дерево находится в левой части SplitPane и я после того как обновляю дерево делаю

SplitPane.setLEftComponent(myTree);

и потом вызываю setSelectedNodeByDTOId

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

или если ставлю тут tree.setSelectionPath(new TreePath(path.toArray())); брекпоинт, то когда с брекпоинта возвращаюсьв приложение выделение тоже видно.
--------------------
qip
PM MAIL   Вверх
Foo
Дата 3.1.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 20.10.2006

Репутация: 2
Всего: 3



под дебагом после строки tree.setSelectionPath(new TreePath(path.toArray()));

вызываю tree.getSelectionModel().getSelectionPath().getLastPathComponent() возвращает правильный элемент дерева, но выдление не отображается .... 
--------------------
qip
PM MAIL   Вверх
Foo
Дата 4.1.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 20.10.2006

Репутация: 2
Всего: 3



вобщем не нашол другого способа как написать свой Renderer и в нем рисовать Border в случае если id шники совпадают...

Код


public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus)
{
.....
            if (tree.getSelectionModel().getSelectionPath() != null && 
                    ((TreeDataNode)value).getDto().getId().equals(TreeController.getSelectedDTOId()) ){
                              cmp.setBorder(new LineBorder(Color.BLUE,1));
            }
.....
}



Добавлено @ 19:02 
кстати может кто знает, когда я делаю для JTree свой рендерер, который представляет из себя например JPanel и сделаю эту панель высокой, тоона обрезается сверху и снизу до определенного  минимального размера, как сделать стандартную высоту элементов в JTree выше?
--------------------
qip
PM MAIL   Вверх
Foo
Дата 5.1.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 20.10.2006

Репутация: 2
Всего: 3



нужно вызвать tree.setRowHeight(0); - тогда высота буде зависеть только от размеров рендера, или tree.setRowHeight(const); - чтобы задать ее одинаковой для всех нодов. 
Хотя если я делал tree.setRowHeight(const); и const - больше 30, то у JSplitPane вертикальный скрол улетат неизвестно куда...
--------------------
qip
PM MAIL   Вверх
Scarlett
Дата 5.1.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 14.12.2006

Репутация: нет
Всего: 1



извини,
может я не понимаю полностью твою проблему.
но не легче ли было бы тебе создать класс, имплементирующий TreeModel
и определить в нем метод, который находит путь к твоему узлу от корня.
при этом у тебя же всегда есть ссылка на родителя, поэтому построить путь будет легко и без рекурсии
а потом делаешь в модели:
 
Код

                    Object[] path = root.getPath(selectNode);
                    TreePath selectedPath = new TreePath(path);
                    setSelectionPath(selectedPath);


и у тебя сразу выделится твой узел


и что значит 
Цитата

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

PM MAIL   Вверх
Foo
Дата 6.1.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 20.10.2006

Репутация: 2
Всего: 3



значит не прорисовывается рамка вокруг него. Это как то связано с рендером, потомучто если я рендер свой не юзаю то все нормально выделяется...
--------------------
qip
PM MAIL   Вверх
Hroft
Дата 9.1.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



А разве tree.updateUI() не поможет? Раз при альт-табе оно перерисовывается, то дело просто в перерисовке. Я не особо разбираюсь, но мне кажется так.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.