2017-07-02 112 views
0

我希望我的JTree能夠通過用戶啓動的搜索(通過樹的元素)進行動態更新。從控制檯上的輸出中,我可以看出,搜索工作就像它應該那樣。問題是更新樹。動態JTree由JTextField中的KeyListener更新

這是我得到的。我有一組類如

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中搜索樹或字符串,並「刪除」與搜索條件不匹配的所有節點。但不是對象,只有對應的樹節點。因此,當用戶完成搜索時,我可以再次顯示整棵樹。

使用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,SEARCHTEXT)一個KeyListener的實現。

請勿使用KeyListener。您應該使用DocumentListener來偵聽文本中的更改。請閱讀Listener For Change on a Document上的Swing教程部分。

+0

感謝您使用DocumentListener的提示。重置模型不起作用。我發佈了我找到的解決方案。 – JKB