2012-03-18 2 views
2

나는 지금 자바를 공부하고 있으며, 하나의 응용 프로그램은 JTree 위젯을 사용하는 간단한 스윙 파일 계층 구조 뷰어입니다. 제 질문은 어떻게 Jtree 마우스 선택 이벤트 리스너를 추가 할 수 있습니까 (여기사용자 정의 트리 모델을 사용하여 스윙 트리 선택 수신기 추가

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 클래스를 확장하기 위해 노력하고 있어요 : 내가 "요컨대 자바 기반 클래스"책에서 (예)를 TreeModel를 이런 식으로 구현 될 경우, 예를 들어 경우 콘솔에 노드의 텍스트 값을) 로그인 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.File에가있는 javax.swing.tree으로 캐스팅 할 수 없습니다. DefaultMutableTreeNode

그래서 어떻게 수정해야합니까?

+1

(문제와 관련이없는) : JTree를을 _extend_ 할 필요가 없다는 (JComponent의를 제외한 모든 JSomething는 응용 프로그램 코드에서 _used_되도록 설계) : 간단하게 설정 코드 어딘가에 리스너를 추가 – kleopatra

답변

3

에 꽤 분명하다. getLastPathComponent ()는 File 객체 (모델이 반환하는 객체)를 반환합니다. 또한 ClassCastException을 피하기 위해 반환 된 Object 정확한 클래스가 필요한지 확인해야 할 수 있습니다. BTW

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

수신기에서 DefaultMutableTreeNode으로 캐스트되지 않습니다. 모델이 e.getPath()를 파일 개체가 포함되어 있기 때문에 getLastPathComponent 방법은 귀하의 경우에 File

스택 트레이스 및 예외 메시지 당신의 TreeModel에서 요소를 반환이