我有一棵樹,有幾個子樹(類別),我如何允許只在指定的子樹中執行多重選擇操作,例如:我可以在類別中選擇多個節點,但是如果我嘗試要選擇其他類別的節點,將取消選擇當前子樹中的節點並選擇一個新節點。JTree的子樹中的多重選擇
1
A
回答
4
的JTree
的默認的選擇模型自己實現的TreeSelectionModel
2
沒有必要實施TreeSelectionModel的,它足以實現與默認模型TreeSelectionListener。這裏有一個半工作示例,需要更多的調整,以完美的工作,但它說明了一個道理:
JFrame f = new JFrame("JTree test");
f.setSize(300, 300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTree t = new JTree();
DefaultTreeModel model = (DefaultTreeModel) t.getModel();
final TreeSelectionModel selectionModel = t.getSelectionModel();
selectionModel.setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
selectionModel.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
// detect additive selections
if (e.isAddedPath()) {
TreePath selection = e.getPath();
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) selection
.getLastPathComponent();
// a contrived way to detect selection of items within a category
if (((String) selectedNode.getUserObject())
.startsWith("Item")) {
// get the new selection's category node
DefaultMutableTreeNode category = (DefaultMutableTreeNode) selection
.getParentPath().getLastPathComponent();
// deselect everything outside that category
ArrayList<TreePath> deselectList = new ArrayList<TreePath>();
for (TreePath path : selectionModel.getSelectionPaths()) {
if (!category.equals(path.getParentPath()
.getLastPathComponent())) {
deselectList.add(path);
}
}
selectionModel.removeSelectionPaths(deselectList
.toArray(new TreePath[deselectList.size()]));
} else {
// completely prevent selection of categories
selectionModel.removeSelectionPath(selection);
}
}
}
});
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
DefaultMutableTreeNode category1 = new DefaultMutableTreeNode("Category 1");
DefaultMutableTreeNode category2 = new DefaultMutableTreeNode("Category 2");
DefaultMutableTreeNode item1 = new DefaultMutableTreeNode("Item 1");
DefaultMutableTreeNode item2 = new DefaultMutableTreeNode("Item 2");
DefaultMutableTreeNode item3 = new DefaultMutableTreeNode("Item 3");
DefaultMutableTreeNode item4 = new DefaultMutableTreeNode("Item 4");
category1.add(item1);
category1.add(item2);
category2.add(item3);
category2.add(item4);
root.add(category1);
root.add(category2);
t.setRootVisible(false);
model.setRoot(root);
f.getContentPane().add(new JScrollPane(t));
f.setVisible(true);
相關問題
- 1. JTree選擇
- 2. JTree的選擇路徑
- 3. JTree選擇顏色
- 4. 選擇子樹中的所有元素
- 5. 選擇框中的父子樹
- 6. 選擇樹中的多個項目
- 7. jtree編程多選
- 8. AlertDialog中的多重選擇
- 9. jqGrid中的多重選擇
- 10. JTree鼠標釋放選擇
- 11. Primefaces建模多選擇樹
- 12. JTree:檢查選擇的級別
- 13. JTree的選擇沒有生成事件
- 14. 覆蓋選擇顏色 - JTree的
- 15. SWT TableViewer無選擇的多重選擇
- 16. 樹中選擇sqlite的
- 17. 基於另一個多重選擇的多重選擇
- 18. 這個例子中的多重選擇是如何工作的?
- 19. 在樹狀複選框列表中選擇的子項目
- 20. 如何在選擇後從JTree中選擇節點?
- 21. 選擇jtree中的所有複選框節點
- 22. jQuery UI的多重選擇
- 23. NSTableView的多重選擇
- 24. GtkCombo的多重選擇
- 25. 的jQuery .bind多重選擇
- 26. 多重選擇器的jQuery
- 27. 通過樹遍歷選擇元素的多選擇器
- 28. 多重選擇 - 選上的jQuery的
- 29. Ionic2,離子選擇多重限制用戶選擇
- 30. TYPO3:的TX-新聞類樹,使子樹只有在選擇主
默認'的TreeSelectionModel'模式'JTree'是'DISCONTIGUOUS_TREE_SELECTION'。 – trashgod
儘管TreeSelectionListener可以正常工作,但我發現這並不穩健,因爲您在設置後正在修改選擇,而不是防止設置不正確的選擇。 –
的確,我的解決方案有點髒,但實現起來更容易,因爲TreeSelectionModel相當複雜。這是一個權衡。 – jblazevic