2017-07-02 6 views
0

ユーザの検索によって動的に更新されるようにしたいと考えています。コンソール上の出力から、検索が正常に動作することがわかります。問題はツリーを更新することです。JTextFieldのKeyListenerによって動的なJTreeが更新される

これは私が得たものです。

public class classA { 

    int id; 

    String name; 

    List<ClassB> listOfClassB; 
} 

public class classB { 

    int id; 

    String name; 

    List<ClassC> listOfClassC; 
} 

public class classC { 

    int id; 

    String name; 
} 

これらのクラスから、createTree()のクラスリストをループしてJTreeを生成します。

private DefaultMutableTreeNode rootNode; 
rootNode = createTree("New", ""); // "New" tells the method to generate the complete tree 
treeModel = new DefaultTreeModel(rootNode); 
JTree myTree = new JTree(treeModel); 

これまでのところとても良いです。今、私は、クラスを検索して、classC.nameまたはclassC.idのStringまたはIntを検索し、検索条件と一致しないすべてのノードを「削除」します。しかし、オブジェクトではなく、対応するツリーノードだけです。ユーザーが検索を終了すると、再びツリー全体を表示することができます。

検索は、JTextFieldとcreateTree(searchOption、searchText)を呼び出すKeyListenerで実装されています。

これまで、removeAllChildren()ですべてのノードを削除してから、検索条件に一致する新しいノードを追加しようとしました。後でTreeModelをリロードすることはここではうまくいかないようです。

createTree(searchOption, searchText); 
rootNode.removeAllChildren(); 
treeModel.reload(rootNode); 

どのように私はそれを達成することができますか?

PS:ツリーとデータを同期させないように、ツリーを削除して新しいツリーを作成するように選択しました。

答えて

0

モデルをリロードする前に、新しいルートノードを作成して設定することで、「新しい」ツリーをロードすることができました。それは私にとっては「きれい」ではないようですが、それはやってしまいました。

rootNode = createTree(searchOption, searchText); 
    treeModel.setRoot(rootNode); 
    treeModel.reload(); 
0
JTree myTree = new JTree(treeModel); 

この文は正しく表示されません。新しいJTreeを作成しますが、ツリーをフレームに追加する場所は表示されません。代わりに、ちょうど木のモデルをリセットし、新しいツリーを作成する

myTree.setModel(treeModel); 

検索がJTextFieldのとcreateTree(searchOption、検索テキスト)を呼び出すのKeyListenerで実装されています。

KeyListenerを使用しないでください。テキストの変更をリッスンするには、DocumentListenerを使用する必要があります。 Listener For Change on a DocumentのSwingチュートリアルのセクションを読んでください。

+0

DocumentListenerを使用していただきありがとうございます。モデルをリセットしても機能しませんでした。私は見つけた解決策を掲示した。 – JKB

関連する問題