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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сравнение объектов TreePath 
V
    Опции темы
malah
Дата 27.2.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго дня!
Вопрос такой: Есть таблица, в ней данные(из узлов дерева), и пути до узла (TreePath), есть и само дерево. Нужно при произвольном выборе узлов из дерева добавлять соответствующие данные в таблицу В ТОМ ЖЕ ПОРЯДКЕ, В КОТОРОМ ОНИ ХРАНЯТСЯ В ДЕРЕВЕ (ЕСЛИ смотреть на дерево в раскрытом виде). Как это можно сделать, и на каких классах это основывается???
Есть ли решения для сравнения объектов TreePath на "<" или ">"
Сам планирую так: при добавлении делать проход по таблице и сравнивая TreePath объекты определять позицию для вставки, вот только как это реализовать не знаю  smile 
PM MAIL   Вверх
w1nd
Дата 28.2.2008, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



У узлов дерева (TreeNode) дети рисуются так же, как получаются из модели (индексированы они). Как наполняли модель, так и будет отображаться.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
malah
Дата 28.2.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Внутри нода индексируютня, но мне то нужна индексация от root... Я накидал примерчик чтоб разобраться... вот код
Код


import javax.swing.*;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.TreeSet;
import java.util.Iterator;

/**
 * Created by IntelliJ IDEA.
 * User: sergey.malahov
 * Date: 18.02.2008
 * Time: 12:50:45
 * To change this template use File | Settings | File Templates.
 */
public class TreeWork extends JFrame {
    private String [] ch1 = {"пункт1", "пункт2", "пункт3"};
    private String [] ch2 = {"параграф1","параграф2"};
    JTree tree;
   // JButton button;
   // TreeSet ts = new TreeSet();
    TreeWork(){
        super("Работа с моделью дерева.");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        DefaultMutableTreeNode root = new  DefaultMutableTreeNode("Оглавление");
        DefaultMutableTreeNode chapter1 = new DefaultMutableTreeNode("глава1");
        DefaultMutableTreeNode chapter2 = new DefaultMutableTreeNode("глава2");
        root.add(chapter1);
        root.add(chapter2);
        for(int i = 0; i < ch1.length; i++){
            chapter1.add(new DefaultMutableTreeNode(ch1[i], false));
        }
        for(int i = 0; i < ch2.length; i++){
            chapter2.add(new DefaultMutableTreeNode(ch2[i], false));
        }
        DefaultTreeModel dtm = new DefaultTreeModel(root, true);
        tree = new JTree(dtm);
        tree.addTreeSelectionListener(new TreeSelectionListener(){
            public void valueChanged(TreeSelectionEvent e){
                TreePath path = e.getPath();
                if ( tree.getModel().isLeaf(path.getLastPathComponent()) ){
                  //ts.add(path.toString());
                   
                  System.out.println(tree.getModel().getIndexOfChild(path.getParentPath().getLastPathComponent(),path.getLastPathComponent()));
                }


            }
        });
       /* button = new JButton("вывод");
        button.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent ae){
               // вывод treeset
               /*Iterator i = ts.iterator();
               while (i.hasNext()){
                   System.out.println(i.next());
               }
           }
        });  */
       // getContentPane().setLayout(new FlowLayout());
        getContentPane().add(new JScrollPane(tree));
       // getContentPane().add(button);
        setSize(200, 400);
        setVisible(true);
    }
    public static void main(String [] args){
        new TreeWork();
    }
}


но вот к сожалению результат не тот который нужен :(
PM MAIL   Вверх
w1nd
Дата 29.2.2008, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Ну для DefaultTreeModel и DefaultMutableTreeNode это решается довольно просто. Например, так:

Код
import java.util.Iterator;
import java.util.NoSuchElementException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class ThroughTreeIteratorSample {
    
    public static class ThroughTreeIterator implements Iterator<DefaultMutableTreeNode> {
        
        private DefaultMutableTreeNode previons;
        
        public ThroughTreeIterator(DefaultMutableTreeNode root) {
            previons = root;
        }
        
        DefaultMutableTreeNode findNextSiblingFor(DefaultMutableTreeNode node) {
            DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent();
            
            if (parent != null) {
                DefaultMutableTreeNode next = (DefaultMutableTreeNode) parent.getChildAfter(node);
                
                if (next == null) {
                    next = findNextSiblingFor(parent);
                }

                return next;
            }
            
            return null;
        }
        
        DefaultMutableTreeNode findNext() {
            DefaultMutableTreeNode next = null;
            
            if (previons.getChildCount() > 0) {
                next = (DefaultMutableTreeNode) previons.getFirstChild();
            }
            
            if (next == null) {
                next = findNextSiblingFor(previons);
            }
            
            return next;
        }

        public boolean hasNext() {
            DefaultMutableTreeNode next = findNext();
            return next != null;
        }

        public DefaultMutableTreeNode next() {
            DefaultMutableTreeNode next = findNext();
            
            if (next == null) {
                throw new NoSuchElementException();
            }
            
            return previons = next;
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }
        
    }

    public static void main(String... args) {
        DefaultMutableTreeNode treeRoot = new DefaultMutableTreeNode("root");
        DefaultTreeModel treeModel = new DefaultTreeModel(treeRoot);
        
        JTree tree = new JTree(treeModel);
        JScrollPane treeScrollPane = new JScrollPane(tree);
        JFrame frame = new JFrame();
        
        frame.setContentPane(treeScrollPane);
        frame.setSize(512, 384);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        DefaultMutableTreeNode branch_1 = new DefaultMutableTreeNode("chapter 1");
        DefaultMutableTreeNode branch_2 = new DefaultMutableTreeNode("chapter 2");
        DefaultMutableTreeNode branch_3 = new DefaultMutableTreeNode("chapter 3");
        
        treeRoot.add(branch_1);
        treeRoot.add(branch_2);
        treeRoot.add(branch_3);

        DefaultMutableTreeNode leaf_1_1 = new DefaultMutableTreeNode("article 1.1");
        DefaultMutableTreeNode leaf_1_2 = new DefaultMutableTreeNode("article 1.2");
        DefaultMutableTreeNode leaf_1_3 = new DefaultMutableTreeNode("article 1.3");

        branch_1.add(leaf_1_1);
        branch_1.add(leaf_1_2);
        branch_1.add(leaf_1_3);

        DefaultMutableTreeNode leaf_2_1 = new DefaultMutableTreeNode("article 2.1");
        DefaultMutableTreeNode leaf_2_2 = new DefaultMutableTreeNode("article 2.2");
        DefaultMutableTreeNode leaf_2_3 = new DefaultMutableTreeNode("article 2.3");
        
        branch_2.add(leaf_2_1);
        branch_2.add(leaf_2_2);
        branch_2.add(leaf_2_3);

        DefaultMutableTreeNode leaf_3_1 = new DefaultMutableTreeNode("article 3.1");
        DefaultMutableTreeNode leaf_3_2 = new DefaultMutableTreeNode("article 3.2");
        DefaultMutableTreeNode leaf_3_3 = new DefaultMutableTreeNode("article 3.3");
        
        branch_3.add(leaf_3_1);
        branch_3.add(leaf_3_2);
        branch_3.add(leaf_3_3);

        frame.setVisible(true);
        
        for (Iterator<DefaultMutableTreeNode> i = new ThroughTreeIterator(treeRoot); i.hasNext(); ) {
            System.out.println(i.next().getUserObject());
        }
    }
    
}


Это сообщение отредактировал(а) w1nd - 29.2.2008, 00:58


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
malah
Дата 15.3.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * Created by IntelliJ IDEA.
 * User: sergey.malahov
 * Date: 18.02.2008
 * Time: 12:50:45
 * To change this template use File | Settings | File Templates.
 */
public class TreeWork extends JFrame {
    private String [] ch1 = {"пункт1", "пункт2", "пункт3"};
    private String [] ch2 = {"параграф1","параграф2"};
    JTree tree;
    static ArrayList map = new ArrayList();
    
    TreeWork(){
        super("Работа с моделью дерева.");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        DefaultMutableTreeNode root = new  DefaultMutableTreeNode("Оглавление");
        DefaultMutableTreeNode chapter1 = new DefaultMutableTreeNode("глава1");
        DefaultMutableTreeNode chapter2 = new DefaultMutableTreeNode("глава2");
        root.add(chapter1);
        root.add(chapter2);
        for(int i = 0; i < ch1.length; i++){
            chapter1.add(new DefaultMutableTreeNode(ch1[i], false));
        }
        for(int i = 0; i < ch2.length; i++){
            chapter2.add(new DefaultMutableTreeNode(ch2[i], false));
        }
        DefaultTreeModel dtm = new DefaultTreeModel(root, true);
        tree = new JTree(dtm);
        indexTree((DefaultMutableTreeNode)tree.getModel().getRoot());
        tree.addTreeSelectionListener(new TreeSelectionListener(){
            public void valueChanged(TreeSelectionEvent e){
                TreePath path = e.getPath();
                if ( tree.getModel().isLeaf(path.getLastPathComponent()) ){
                    System.out.println(map.indexOf(path.getLastPathComponent()));
                }
            }
        });
        getContentPane().add(new JScrollPane(tree));
        setSize(200, 400);
        setVisible(true);
    }

    public void indexTree(DefaultMutableTreeNode parant){
        for(int i = 0, max = tree.getModel().getChildCount(parant); i<max; i ++)
            if (!parant.getChildAt(i).isLeaf()) {
                indexTree((DefaultMutableTreeNode) parant.getChildAt(i));
            }
            else {
                map.add(parant.getChildAt(i));
            }
    }

    public static void main(String [] args){
        new TreeWork();
        Iterator ind = map.iterator();
        while(ind.hasNext()){
            System.out.println(ind.next().toString());
        }
    }
}

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.0843 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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