2009-03-15 7 views
0

私は、ファイルシステムのディレクトリ用のJTree実装を持っています。私が持っている問題は、ディレクトリが削除されたり、名前が変更されたときに、そのツリーが親ディレクトリにそのディレクトリをまだ表示しているということです。親ツリーは、ノードが展開されると、変更のために更新されないようです。(ファイルシステムツリー内の)JTreeキャッシュノードを停止できますか?

私が書いたモデルはキャッシュされません(制限されたキャッシングには何のコメントがありますか?)JTree自体がノードをキャッシュしているようです。

コード(モデルは、ネストされたサブクラスである):

public class FileSystemTree 
extends JTree 
{ 

// ***************************************************************************** 
// INSTANCE CREATE/DELETE 
// ***************************************************************************** 

public FileSystemTree() { 
    this(new Model(null,null,null)); 
    } 

public FileSystemTree(String startPath) { 
    this(new Model(startPath,null,null)); 
    } 

public FileSystemTree(FileSelector inc, FileSelector exc) { 
    this(new Model(null,inc,exc)); 
    } 

public FileSystemTree(String startPath, FileSelector inc, FileSelector exc) { 
    this(new Model(startPath,inc,exc)); 
    } 

private FileSystemTree(Model model) { 
    super(model); 

    //setLargeModel(true); 
    setRootVisible(false); 
    setShowsRootHandles(true); 
    putClientProperty("JTree.lineStyle","Angled"); 
    } 

// ***************************************************************************** 
// INSTANCE METHODS - ACCESSORS 
// ***************************************************************************** 

public Object getRoot() { 
    return getModel().getRoot(); 
    } 

// ***************************************************************************** 
// INSTANCE METHODS 
// ***************************************************************************** 

public String convertValueToText(Object value,boolean selected,boolean expanded,boolean leaf,int row,boolean hasFocus) { 
    File        fil=(File)value; 

    return (fil.getName().length()!=0 ? fil.getName() : fil.getPath()); 
    } 

// ***************************************************************************** 
// STATIC NESTED CLASSES - SUPPORTING MODEL 
// ***************************************************************************** 

    static class Model 
    extends Object 
    implements TreeModel, FilenameFilter 
    { 

    private File      root;         // tree root 
    //ivate Map       cache;         // caches child counts for directories 
    private File[]      fsRoots;        // copy of file system roots 
    private FileSelector    include;        // inclusion selector 
    private FileSelector    exclude;        // exclusion selector 
    private java.util.List    listeners=new ArrayList(); 

    public Model(String roo, FileSelector inc, FileSelector exc) { 
     super(); 

     root=(roo==null ? DRIVES : new File(roo)); 
     //cache=new HashMap(); 
     fsRoots=(root==DRIVES ? rootList() : null); 
     include=inc; 
     exclude=exc; 
     } 

    // ***************************************************************************** 
    // METHODS - MODEL 
    // ***************************************************************************** 

    public Object getRoot() { 
     return root; 
     } 

    public Object getChild(Object parent, int index) { 
     File       dir=(File)parent; 

     if(dir==DRIVES) { 
      File[] chl=fsRoots; //rootList(); 
      return (index<chl.length ? chl[index] : null); 
      } 
     else { 
      String[] chl=dirList(dir); 
      return (index<chl.length ? new File(dir,chl[index]) : null); 
      } 
     } 

    public int getChildCount(Object parent) { 
     File       dir=(File)parent; 
     //Integer       cch=(Integer)cache.get(dir); 

     //if(cch!=null) { 
     // return cch.intValue(); 
     // } 

     if(dir==DRIVES) { 
      return fsRoots.length; //rootList().length; 
      } 
     else if(dir.isDirectory()) { 
      return dirList(dir).length; 
      } 
     else { 
      return 0; 
      } 
     } 

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

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

    public int getIndexOfChild(Object parent, Object child) { 
     File       dir=(File)parent; 
     File       fse=(File)child; 

     if(dir==DRIVES) { 
      File[] ca=fsRoots; //rootList(); 
      for(int xa=0; xa<ca.length; xa++) { 
       if(fse.equals(ca[xa])) { return xa; } 
       } 
      } 
     else { 
      String[] ca=dirList(dir); 
      for(int xa=0; xa<ca.length; ++xa) { 
       if(fse.getName().equals(ca[xa])) { return xa; } 
       } 
      } 
     return -1; 
     } 

    private File[] rootList() { 
     File[]       lst=File.listRoots(); 

     if(lst==null) { lst=new File[0]; } 
     //cache.put(DRIVES,new Integer(lst.length)); 
     return lst; 
     } 

    private String[] dirList(File dir) { 
     String[]      lst=dir.list(this); 

     if(lst==null) { lst=new String[0]; } 
     //cache.put(dir,new Integer(lst.length)); 
     return lst; 
     } 

    // ***************************************************************************** 
    // METHODS - FILENAME FILTER 
    // ***************************************************************************** 

    public boolean accept(File dir, String nam) { 
     return ((include==null || include.accept(dir,nam)) && (exclude==null || !exclude.accept(dir,nam))); 
     } 

    // ***************************************************************************** 
    // METHODS - LISTENER 
    // ***************************************************************************** 

    public void addTreeModelListener(TreeModelListener listener) { 
     if(listener != null && !listeners.contains(listener)) { 
      listeners.add(listener); 
      } 
     } 

    public void removeTreeModelListener(TreeModelListener listener) { 
     if(listener != null) { 
      listeners.remove(listener); 
      } 
     } 

    public void fireTreeNodesChanged(TreeModelEvent evt) { 
     Iterator      itr=listeners.iterator(); 

     while(itr.hasNext()) { 
      TreeModelListener listener=(TreeModelListener)itr.next(); 
      listener.treeNodesChanged(evt); 
      } 
     } 

    public void fireTreeNodesInserted(TreeModelEvent evt) { 
     Iterator      itr=listeners.iterator(); 

     while(itr.hasNext()) { 
      TreeModelListener listener=(TreeModelListener)itr.next(); 
      listener.treeNodesInserted(evt); 
      } 
     } 

    public void fireTreeNodesRemoved(TreeModelEvent evt) { 
     Iterator      itr=listeners.iterator(); 

     while(itr.hasNext()) { 
      TreeModelListener listener=(TreeModelListener)itr.next(); 
      listener.treeNodesRemoved(evt); 
      } 
     } 

    public void fireTreeStructureChanged(TreeModelEvent evt) { 
     Iterator      itr=listeners.iterator(); 

     while(itr.hasNext()) { 
      TreeModelListener listener=(TreeModelListener)itr.next(); 
      listener.treeStructureChanged(evt); 
      } 
     } 
    } // END INNER CLASS 

// ***************************************************************************** 
// STATIC PROPERTIES 
// ***************************************************************************** 

static private final File    DRIVES=new File("*DRIVES");    // marker for listing file system drives 

} // END PUBLIC CLASS 

答えて

2

モデルは、リスナーにツリー構造の変更を通知する役割を担います。そのような通知がない場合、ツリー自体はリフレッシュされません。

+0

私はツリーが機能する方法を誤解していました。ファイルシステムの変更を通知するためにモデルを使用しなければならないことを認識しませんでした。私の場合は何が変わったのか正確に分かっているので、木モデルイベントを発射するのは簡単でした。 –

0

あなたは、ファイルシステムの変更を探し、いくつかのバックグラウンドスレッドを書いて、あなたは、ディレクトリが変更されたことを検出した場合、いくつかのモデル修正イベントを発生可能性があります。

0

モデルのコードが表示されていない場合、getChildメソッドなど、呼び出されていますか?

+0

@TofuBeer:コードは質問に掲載されます.JTreeサブクラスのネストされたクラスです。 –

+0

申し訳ありませんが、それを逃した必要があります。 – TofuBeer

関連する問題