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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить Index выбранной в ветки в JTree? 
:(
    Опции темы
freshAngel
  Дата 27.3.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Привет.
Есть такая структура дерева:
[-] Корень
   [-] Ветка 1
          Значение 1 
          Значение 2 
          Значение 3 
          Значение 4 
          Значение 5

Как получить индексный номер выбранного значения!?

Сейчас у меня выглядит так:
Код

jTree.addTreeSelectionListener(new TreeSelectionListener()
{
public void valueChanged(TreeSelectionEvent e)
{
Object obj = jTree.getLastSelectedPathComponent();
        if(obj!=null)
        {
            DefaultMutableTreeNode sel = (DefaultMutableTreeNode)obj;
        System.out.println(sel.getLevel()+"/"+sel.toString());
        }

 }
});
 

Что нужно добавить, что-бы получить Index выбранной в данный момент ветки!?

И еще вопрос, что-бы не плодить темы.
Как получить событие, когда пользователь начал/закончил редактировать выбранную ветку дерева!?

Это сообщение отредактировал(а) freshAngel - 27.3.2010, 10:05
PM MAIL   Вверх
jk1
Дата 27.3.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Насчет перехвата событий. Вот самый общий способ
Код

        tree.getCellEditor().addCellEditorListener(new CellEditorListener() {
            @Override
            public void editingStopped(ChangeEvent e) {

            }

            @Override
            public void editingCanceled(ChangeEvent e) {
                
            }
        });

Если вы назначали дереву собственный Editor, то возможностей гораздо больше. Для примера, если в назначили дереву JTextField в качестве Editor'а, то на это текстовое поле можно будет повесить  CaretListener и получать события от каждого введенного или удаленного символа при редактировании ячейки дерева.

Про индексный номер

Что вы понимаете под "индексным номером"? Для ячейки дерева определено понятие row, вот так можно получить массив row для выбранных ячеек таблицы
Код

tree.getSelectionRows()


Это сообщение отредактировал(а) jk1 - 27.3.2010, 10:23


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
freshAngel
  Дата 27.3.2010, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(jk1 @ 27.3.2010,  10:18)
Про индексный номер

Что вы понимаете под "индексным номером"? Для ячейки дерева определено понятие row, вот так можно получить массив row для выбранных ячеек таблицы
Код

tree.getSelectionRows()

Если я нажал мышкой на: Значение 2, то в выводе хочу получить: 2
Если выбрал: Значение 5, то в выводе хочу получить 5
и т.д.

В зависимости от этого индекса планирую выбирать таблицу в БД, куда записывать измененные данные...

Это сообщение отредактировал(а) freshAngel - 27.3.2010, 10:37
PM MAIL   Вверх
jk1
Дата 27.3.2010, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

Object parent = tree.getSelectionPath().getParentPath().getLastPathComponent();
Object child = tree.getSelectionPath().getLastPathComponent();
System.out.println(tree.getModel().getIndexOfChild(parent, child));



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
freshAngel
  Дата 27.3.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(jk1 @ 27.3.2010,  10:40)
Код

Object parent = tree.getSelectionPath().getParentPath().getLastPathComponent();
Object child = tree.getSelectionPath().getLastPathComponent();
System.out.println(tree.getModel().getIndexOfChild(parent, child));

Спасибо большое!
PM MAIL   Вверх
freshAngel
  Дата 27.3.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(jk1 @ 27.3.2010,  10:18)
Насчет перехвата событий. Вот самый общий способ
Код

        tree.getCellEditor().addCellEditorListener(new CellEditorListener() {
            @Override
            public void editingStopped(ChangeEvent e) {

            }

            @Override
            public void editingCanceled(ChangeEvent e) {
                
            }
        });

Если вы назначали дереву собственный Editor, то возможностей гораздо больше. Для примера, если в назначили дереву JTextField в качестве Editor'а, то на это текстовое поле можно будет повесить  CaretListener и получать события от каждого введенного или удаленного символа при редактировании ячейки дерева.

Про индексный номер

Что вы понимаете под "индексным номером"? Для ячейки дерева определено понятие row, вот так можно получить массив row для выбранных ячеек таблицы
Код

tree.getSelectionRows()

Еще вопрос, а как из этого потом получить новое имя нода!?
Которое изменил пользователь!!!
Если вставить снова

Код

   Object obj = jTree.getLastSelectedPathComponent();
        if(obj!=null)
        {
            DefaultMutableTreeNode sel = (DefaultMutableTreeNode)obj;
            System.out.println("Измененная ветка: "+sel.toString());

        }


Выдает старое название ветки...

Это сообщение отредактировал(а) freshAngel - 27.3.2010, 11:33
PM MAIL   Вверх
jk1
Дата 27.3.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Такой вариант подойдет?
Код

public void editingStopped(ChangeEvent e) {
                System.out.println(((TreeCellEditor)e.getSource()).getCellEditorValue());
            }



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
freshAngel
  Дата 27.3.2010, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(jk1 @ 27.3.2010,  11:44)
Такой вариант подойдет?
Код

public void editingStopped(ChangeEvent e) {
                System.out.println(((TreeCellEditor)e.getSource()).getCellEditorValue());
            }

Да. Все работает. 
Спасибо!
А как можно перерисовать модель дерева!?
PM MAIL   Вверх
jk1
Дата 28.3.2010, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Модель дерева не рисуется на экране, рисуется view, а модель - это просто способ хранения данных для view. Перерисовать само дерево в общем можно вызовом метода repaint();.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
freshAngel
  Дата 28.3.2010, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(jk1 @ 28.3.2010,  00:02)
Модель дерева не рисуется на экране, рисуется view, а модель - это просто способ хранения данных для view. Перерисовать само дерево в общем можно вызовом метода repaint();.

Спасибо!
А как сделать вставку сразу нескольких веток в дерево!?
Например:

Ветка1 - > Ветка 1.1. -> Ветка 1.1.1 и т.д.

Делаю так:
Код


DefaultMutableTreeNode tmp = new DefaultMutableTreeNode("1");
model.insertNodeInto(tmp, sel, sel.getChildCount());

DefaultMutableTreeNode tmp1 = new DefaultMutableTreeNode("1.1");
insertNodeInto(tmp1, tmp, sel.getChildCount());
[/code]

Ветка 1.1 не вставляется в 1

Вообще проблема в том, что я делаю парсинг БД, потом строю дерево.
Есть функция добавления узлов. При добавлении узла он записывается в БД, а в дереве не появляется.
Поэтому тут два пути:
1. Снова сделать парсинг и подхватить инфу о новой ветки дерева.
   Но тут я не знаю как очистить все дерево, что-бы снова построить его элементы.
2. Добавить нужные узлы вручную, через модель.

Работает.
Код

DefaultMutableTreeNode tmp = new DefaultMutableTreeNode("1");
model.insertNodeInto(tmp, sel, sel.getChildCount());

DefaultMutableTreeNode tmp1 = new DefaultMutableTreeNode("1.1");
insertNodeInto(tmp1, tmp, tmp.getChildCount());


Передал в метод количество детей ранее созданного узла.

Это сообщение отредактировал(а) freshAngel - 28.3.2010, 08:36
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0720 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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