Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > сравнение объектов TreePath


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

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

Автор: malah 28.2.2008, 14:58
Внутри нода индексируютня, но мне то нужна индексация от 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();
    }
}


но вот к сожалению результат не тот который нужен :(

Автор: w1nd 29.2.2008, 00:53
Ну для 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());
        }
    }
    
}

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

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());
        }
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)