Добавление слушателя выбора дерева Swing с пользовательской моделью дерева - PullRequest
2 голосов
/ 19 марта 2012

Сейчас я изучаю Java, и одно из моих приложений - это простой просмотрщик иерархии файлов Swing, который использует виджет JTree. Мой вопрос заключается в том, как добавить обработчик событий выбора мыши Jtree (например, записать текстовое значение узла в консоль). в случае, когда я реализовал TreeModel таким образом (пример из книги «Java Foundation Classes in Nutshell»):

    public class FileTreeDemo {
    public static void main(String[] args) {
        File root;
        if (args.length > 0)
            root = new File(args[0]);
        else
            root = new File(System.getProperty("user.home"));

                FileTreeModel model = new FileTreeModel(root);

        MyJtree tree = new MyJtree();
        tree.setModel(model);

        JScrollPane scrollpane = new JScrollPane(tree);

        JFrame frame = new JFrame("FileTreeDemo");
        frame.getContentPane().add(scrollpane, "Center");
        frame.setSize(400, 600);
        frame.setVisible(true);
    }
}

class FileTreeModel implements TreeModel {
    protected File root;

    public FileTreeModel(File root) {
        this.root = root;
    }

    public Object getRoot() {
        return root;
    }

    public boolean isLeaf(Object node) {
        return ((File) node).isFile();
    }

    public int getChildCount(Object parent) {
        String[] children = ((File) parent).list();
        if (children == null)
            return 0;
        return children.length;
    }

    public Object getChild(Object parent, int index) {
        String[] children = ((File) parent).list();
        if ((children == null) || (index >= children.length))
            return null;
        return new File((File) parent, children[index]);
    }

    public int getIndexOfChild(Object parent, Object child) {
        String[] children = ((File) parent).list();
        if (children == null)
            return -1;
        String childname = ((File) child).getName();
        for (int i = 0; i < children.length; i++) {
            if (childname.equals(children[i]))
                return i;
        }
        return -1;
    }

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

    public void addTreeModelListener(TreeModelListener l) {
    }

    public void removeTreeModelListener(TreeModelListener l) {
    }
}

Здесь я пытаюсь расширить класс JTree с помощью MyJtree и добавить AddTreeSelectionListener

public class MyJtree extends JTree {
    public MyJtree() {
        super();
        this.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) e
                        .getPath().getLastPathComponent();
                System.out.println("You selected " + node);
            }
        });
    }
}

Но затем я нажимаю на элемент JTree, я получаю это:

Исключение в потоке "AWT-EventQueue-0" java.lang.ClassCastException: Файл java.io. не может быть приведен к javax.swing.tree.DefaultMutableTreeNode

Итак, как мне это исправить?

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

Не приведен к DefaultMutableTreeNode в вашем слушателе. Метод getLastPathComponent возвращает элемент из вашего TreeModel, который в вашем случае является File

Сообщение об отслеживании стека и об исключительной ситуации довольно ясно для этого

3 голосов
/ 19 марта 2012

Поскольку ваша модель содержит объекты File, e.getPath (). GetLastPathComponent () возвращает объект File (только объект, который возвращает ваша модель).Кроме того, чтобы избежать ClassCastException, вы можете проверить, является ли возвращаемый объект точным классом, который вы ожидаете.

Object object = e.getPath().getLastPathComponent(); 
if (object instanceof File){ 
    File file = (File) object; 
}
...