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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTree + TreeModel. CellRenderer, Как корректно работать без нодов? 
:(
    Опции темы
chief39
Дата 12.7.2005, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Суть такая:

есть дерево и есть модель для него.
Из файла тяну древовидную структуру. Методы доступа к ней реализованы в моей TreeModel.

Рисую СеллРендерером в каждом ноде панельку с несколькими лейблами, извлечёнными из объекта моей древесины(TreeModel).

В общем всё неплохо...

Но!

Пытаюсь удалять....

Поскольку ноды у меня - это ссылки на мои специфические объекты - то их и надо у далять из этой структуры. В каждом объекте есть эррейлист ссылок на сыновей из которого удаляю нужного сына.
Всё хорошо, всё отлично.... но элемент отображается по прежнему. smile
В листе его нет ( проверял ), каунт листа уменьшился на единицу....
И всё-таки, фугас ему в глаз, он отображается!!!!
но ссылочка есть.... Потому как вытягиваются из него данные рендерером и на станд. вывод тоже.....

Мне кажется, что для него создаётся нод, который на него указывает и который надо удалить.... Но как???

Пытаясь получить селекшн - получаю свой элемент но никак не ноду.

Рэпейнты и ревалидейты пробовал...

КАК ЕГО УБРАТЬ???






--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
batigoal
Дата 12.7.2005, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

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



Может, в лоб - создание копии дерева без этого нода и его отображение?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
AntonSaburov
Дата 12.7.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Хорошо бы конечно код посмотреть. И надо бы в FAQ заглянуть. Пример работы с JTree
PM MAIL WWW ICQ   Вверх
chief39
Дата 12.7.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Цитата(AntonSaburov @ 12.7.2005, 12:08)
Хорошо бы конечно код посмотреть. И надо бы в FAQ заглянуть. Пример работы с JTree


Я туда и заглядывал smile По сайтикам и факам полазил.
Там всё о TreeNode




--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Andyb
Дата 12.7.2005, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

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



Попробуй treeModel.reload(); после удаления, а потом перерисовать родительский узел

Это сообщение отредактировал(а) Andyb - 12.7.2005, 12:33
--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
chief39
Дата 12.7.2005, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Это из фака:

Код

DefaultTreeModel model = (DefaultTreeModel)jTree.getModel();
        Object obj = jTree.getLastSelectedPathComponent();
        if(obj!=null)
        {
            DefaultMutableTreeNode sel = (DefaultMutableTreeNode)obj;


В последней строчке у меня возвращается не DefaultMutableTreeNode а Question (мой классик. Всякая информация о себе же и там же списочек на другие ноды)

Только что проверил - если вытягивать элемент который не удалился через переписаную мной функцию public Object getChild(Object parent, int index) для TreeModel - там нулл как и должно быть. с count этих подНодов тоже всё в порядке.

То есть модель работает корректно.... (когда я её потом сохраняю в файл - там всё как и должно быть)

Но из самого JTree судя по всему остаётся ссылка на этот объект Question!!!
То есть подтягивает данные из тримодела а потом работает само... по своим ссылочкам, или нет?
smile
Добавлено @ 12:35
Цитата
Попробуй treeModel.reload();, а потом перерисовать родительский узел


можно поподробнее?

Меня тоже потянуло поискать чёт на "re" но там такого нет smile
не находит....


Перерисовываю всё дерево (вернее repaint, revalidate)

что за релоад и с чем его едят???


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Andyb
Дата 12.7.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

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



Цитата
что за релоад и с чем его едят???

Релоад модели дерева
Код

DefaultTreeModel model = (DefaultTreeModel)jTree.getModel();
   model.reload();

--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
chief39
Дата 12.7.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Я имплементил свою от TreeModel

Там такого нет...

унаследовал от DefaultTreeModel - хочет конструктор с рутом. В рут хочет нод а не мой класс.

Тупик. Как это обойти? Сегодня почти не спал и туго соображаю....

просто с TreeModel это можно сделать (что-то похожее) ?




--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
DarkDS
Дата 12.7.2005, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



TreeModel у тебя от Дефолт наследованна или просто реализация своя?
Если от дефолт, то поможет вызов метода: fireTreeStructureChanged
Добавлено @ 13:00
Увидел. Поздно. Сейчас пример кину своей имплементации fireTreeStructureChanged
Добавлено @ 13:01
Лишее нужно удалить, но идея я думаю понятна smile
Код

import java.util.ArrayList;

import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

/**
 * @author dsilinski
 *
 */
public class LearTreeModel implements TreeModel
{
    private RootNode m_root;
    private ArrayList m_treeModelListeners;
    /**
     * 
     */
    public LearTreeModel( RootNode root )
    {
        super();
        
        m_treeModelListeners = new ArrayList();
        m_root = root;
    }

    public Object getRoot()
    {
        return m_root;
    }

    public Object getChild( Object parent, int index )
    {
        if ( parent instanceof MultiChildNode )
        {
            return ((MultiChildNode)parent).get( index );
        }
        return null;
    }

    public int getChildCount( Object parent )
    {
        if ( parent instanceof MultiChildNode )
        {
            return ((MultiChildNode)parent).getCount();
        }
        return 0;
    }

    public boolean isLeaf( Object node )
    {
        return (getChildCount( node ) > 0)?false:true;
    }

    public void valueForPathChanged( TreePath path, Object newValue ) {}

    public int getIndexOfChild( Object parent, Object child )
    {
        if ( parent instanceof MultiChildNode )
            return ((MultiChildNode)parent).indexOf( child );
        return -1;
    }

    public void addTreeModelListener( TreeModelListener l )
    {
        m_treeModelListeners.add( l );
    }

    public void removeTreeModelListener( TreeModelListener l )
    {
        m_treeModelListeners.remove( l );
    }
    
    protected void fireTreeStructureChanged( TreeModelEvent e )
    {
        for (int i = 0; i < m_treeModelListeners.size(); i++)
        {
            ((TreeModelListener)m_treeModelListeners.get(i)).
                        treeStructureChanged( e );                
        }
    }
}

Добавлено @ 13:03
ЗЫ. Дерево тут не обновляется. Обновление происходит из наследника вызовом метода fireTreeStructureChanged.
По идее единственное что нужно перенести - addTreeModelListener, removeTreeModelListener, fireTreeStructureChanged
PM MAIL   Вверх
Andyb
Дата 12.7.2005, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

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



Цитата
DefaultTreeModel - хочет конструктор с рутом. В рут хочет нод а не мой класс.

можно сделать так:
Код

DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
    DefaultTreeModel model= new DefaultTreeModel(root);
    JTree tree = new JTree(model);
    MyClass myClass = new  MyClass();//Твой класс
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(myClass);
    int n = root.getChildCount();
    model.insertNodeInto(node,root,n);
......................



Это сообщение отредактировал(а) Andyb - 12.7.2005, 13:39
--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
chief39
Дата 12.7.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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




smile

Я чуть не опупел.....

Вчера до 11 сидел и сегодня с 7 на работе... аж обидно.... smile

оказывается.....

Код


parent.remove(question); // это я удалял из своей модели элементик....

SwingUtilities.updateComponentTreeUI(tree);  // а вот что помогло.....





Всё работает без нодов и дефолт деревяной модели

просто имплементировал деревянную модель и переписал чтоб она тягала данные из моей деревянной smile

Спасибо всем за советы. Покопался smile



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

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

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

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


 




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


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

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