2012-03-18 2 views
2

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

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 пункта, я получаю это:

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

Итак, как я должен это исправить?

+1

кстати (не связано с проблемой): нет необходимости _extend_ в JTree (все JSomething кроме JComponent предназначены для _used_ в коде приложения): просто добавьте слушателя где-то в коде установки – kleopatra

ответ

3

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

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

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

StackTrace и сообщение исключения довольно ясно на этом

 Смежные вопросы

  • Нет связанных вопросов^_^