2012-03-18 5 views
2

私は今、Javaを勉強しています。私のアプリケーションの1つは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) { 
    } 
} 

ここでiをJTreeのクラスを拡張しようとしています:私はこの方法(本「一言でJava基礎クラス」)からの例では、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 exactクラスが予期しているものかどうかを確認するとよいでしょう。ところで

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

リスナーでDefaultMutableTreeNodeにキャストしないでください。あなたのモデルは、e.getPathを()Fileオブジェクトが含まれているのでgetLastPathComponent方法は、あなたのケースでFile

スタックトレースと例外メッセージは、あなたのTreeModel、から要素を返しますが、この

関連する問題