0

展開するたびにフォルダデータを取得するftpプログラムがあります。これは、次のようなモデルを使用して行われます。


    private void FilesTreeTreeExpanded(javax.swing.event.TreeExpansionEvent evt) {
String path = new String("");

 DefaultMutableTreeNode chosen = (DefaultMutableTreeNode) evt.getPath().getLastPathComponent();

 String[] pathArray = evt.getPath().toString().replaceAll("]", "").split(",");
 for (int i = 1 ; i < pathArray.length ; i++) path += "/"+ pathArray[i].trim();

// i were aded chosen.removeAllChildren(); without success ftp.GoTo(path);

ArrayList listDir = null; listDir = ftp.ListDir(); ArrayList listFiles = null; listFiles = ftp.ListFiles(); DefaultMutableTreeNode child = null , dir = null , X = null; //this will add files to tree for (int i = 0; i < listFiles.size(); i++) { child = new DefaultMutableTreeNode(listFiles.get(i)); if(listFiles.size() > 0) model.insertNodeInto(child, chosen, 0); } //this will add dirs to list for (int i = 0; i < listDir.size(); i++) { X = new DirBranch("در حال دریافت اطلاعات ...").node(); dir = new DirBranch( (String) listDir.get(i)).node(); dir.add(X); if(listDir.size() > 0) model.insertNodeInto(dir, chosen, 0); } FilesTree.setModel(model); //this is my Swing JTree }

問題は、JTreeを展開するたびに、ファイルとフォルダーのリストが重複することです。だから私はchosen.removeAllChildren();を使おうとしました。@コードの先頭ですが、何も削除されませんでした。私は何をすべきか?

4

3 に答える 3

6

モデルは正しいですが、JTreeは古い情報で動作しています。

このremoveAllChildren()メソッドは子を削除しますが、イベントを発生させず、model.insertNodeInto()挿入イベントを発生させます。したがって、JTreeはノードが追加されていることを認識しますが、ノードが削除されていることを認識しません。

新しい子を追加した後、呼び出しmodel.reload(chosen)て下のツリーを無効にしてみてくださいchosen

ブランチをリロードするので、に変更model.insertNodeInto(dir, chosen,0)することもできますchosen.insert(dir,0)。これにより、投稿されるイベントの数が減ります。

于 2011-05-09T20:24:48.057 に答える
1

呼び出すremoveAllChildren()と、ノードから子が削除されます。重複を作成している何かがここで起こっているに違いありません。何も2回呼び出さないようにし、ツリーの表示を更新していることを確認してください。

于 2011-04-11T16:18:32.570 に答える
0

私のアプリケーションでも、同じ問題が発生しています。そのために私は次のコードを使用しました。

    JTree.removeAll();
    JTree.setModel(null);

Jtreeからすべての子ノードを削除します。

于 2014-01-21T13:30:52.313 に答える