В этой статье используется конкретный код, отображаемый в флажке Java Jtree JCheckbox для вашей ссылки. Конкретный контент заключается в следующем
1.CHECKTREEMANAGER.JAVA
Public Class CeckTremanager Extens MouseAdapter реализует reeselectionListener {Private ChectRereselectionModel SelectionModel = null; // частное jtree tree = new jtree (); частное дерево jtree = null; int hotspot = new jcheckbox (). getPreferredSize (). ширина; public checttreemanager (jtree tree) {this.tree = tree; selectionModel = new ChecktreeSelectionModel (tree.getModel ()); tree.setCellrenderer (новый CheckTreeCellRenderer (Tree.getCellrenderer (), SelectionModel)); Tree.AddMouseListener (это); // мыши прослушивание selectionmodel.addtreeselectionListener (это); // Выбор дерева прослушивание} public void mouseeClicked (mouseVent me) {treepath path = tree.getPathforlocation (me.getx (), me.gety ()); if (path == null) return; if (me.getx ()> tree.getPathbounds (path) .x+hotspot) return; Boolean Selected = SelectionModel.ispathsected (Path, True); SelectionModel.RemovetReeselectionListener (это); попробуйте {if (selected) selectionmodel.removeselectionpath (path); else SelectionModel.AddSelectionPath (Path); } наконец {selectionModel.addtreeselectionListener (this); tree.treedidchange (); }} public checttreelectionmodel getSelectionModel () {return SelectionModel; } public void valueChanged (TreesElectionEvent e) {tree.treedidchange (); }} 2. Checktreeselectionmodel.java
Public Class ChecttreelectionModel Extends DefaultTreesElectionModel {Private TreeModel Model; public checttreelectionmodel (treemodel model) {this.model = model; setSelectionMode (ereeselectionmodel.discontigage_tree_selection); } // проверяет, существует ли какой -либо невыбранный узел в поддерею данного пути публичный логический подразделение ISpartivally Selected (TreePath Path) {if (ispathsected (path, true)) вернуть false; Treepath [] selectionpaths = getSelectionPaths (); if (selectionpaths == null) вернуть false; for (int j = 0; j <selectionpaths.length; j ++) {if (isdescendant (selectionPaths [j], path)) вернуть true; } вернуть false; } // рассказывает, выбран ли данный путь. // Если раскопать истинность, то предполагается, что путь будет выбран, если // // один из его предка выбран. public boolean ispathselected (treepath path, boolean dig) {if (! dig) вернуть супер. while (path! = null &&! super.ispathselected (path)) path = path.getParentPath (); возвратный путь! = NULL; } // является потомком PATH1 PATH2 Private Boolean Isdescendend (TreePath Path1, TreePath Path2) {Object obj1 [] = path1.getPath (); Объект obj2 [] = path2.getPath (); for (int i = 0; i <obj2.length; i ++) {if (obj1 [i]! = obj2 [i]) вернуть false; } вернуть true; } public void setSelectionPaths (treePath [] ppaths) {бросить новое UnsupportedOperationException ("еще не реализован !!!"); } public void AddSelectionPaths (treePath [] paths) {// не определить все потомки путей [] для (int i = 0; i <paths.length; i ++) {treepath path = paths [i]; Treepath [] selectionpaths = getSelectionPaths (); if (selectionpaths == null) разрыв; Arraylist toberemoved = new ArrayList (); for (int j = 0; j <selectionpaths.length; j ++) {if (isdescender (selectionpaths [j], path)) toberemoved.add (selectionpaths [j]); } super.removeselectionpaths ((treepath []) toberemoved.toarray (new treepath [0])); } // Если все братья и сестры выбраны, то не выберете их и выберите родительский рекурсивно // otherwize просто выберите этот путь. for (int i = 0; i <paths.length; i ++) {treepath path = paths [i]; TreePath Temp = null; while (aresiblingsselected (path)) {temp = path; if (path.getParentPath () == null) разрыв; path = path.getParentPath (); } if (temp! = null) {if (temp.getParentPath ()! = null) addselectionPath (temp.getParentPath ()); else {if (! isselectionempty ()) removeSelectionPaths (getSelectionPaths ()); Super.AddSelectionPaths (new TreePath [] {temp}); }} else Super.AddSelectionPaths (new TreePath [] {path}); }} // говорит, выбраны ли все братья и сестры данного пути. Частный логический Aresiblingsselected (Path TreePath) {treePath Parent = path.getParentPath (); if (parent == null) вернуть true; Object Node = path.getLastPathComponent (); Object parentNode = parent.getLastPathComponent (); int ChildCount = model.getChildCount (parentNode); for (int i = 0; i <childcount; i ++) {object childnode = model.getchild (parentnode, i); if (ChildNode == Узел) Продолжить; if (! ispathsesected (parent.pathbyaddingchild (Childnode))) вернуть false; } вернуть true; } public void RemovEseletectionPaths (treePath [] paths) {for (int i = 0; i <paths.length; i ++) {treepath path = paths [i]; if (path.getPathcount () == 1) super.removeselectionPaths (new TreePath [] {path}); иначе TogglerEmoveselection (Path); }} // Если выбран какой -либо узел предка данного пути, то не выберет его // и выберите всех его потомков, кроме данного пути и потомков. // в противном случае просто не определите данный путь private void togglerEmoveselection (treepath path) {stack stach = new Stack (); Treepath parent = path.getParentPath (); while (parent! = null &&! ispathSelected (parent)) {Stack.push (parent); parent = parent.getParentPath (); } if (parent! = null) stack.push (parent); else {super.removeselectionPaths (new TreePath [] {path}); возвращаться; } while (! Stack.isempty ()) {treepath temp = (treepath) stack.pop (); Treepath peekpath = stack.isempty ()? Путь: (treepath) stack.peek (); Object Node = temp.getLastPathComponent (); Object peeknode = peekpath.getlastPathComponent (); int ChildCount = model.getChildCount (узлы); for (int i = 0; i <childcount; i ++) {object childnode = model.getchild (node, i); if (childnode! = peeknode) super.addselectionpaths (new treepath [] {temp.pathbyaddingchild (Childnode)}); }} super.removeselectionPaths (new TreePath [] {parent}); }} 3.CHECKTREECELLRENERER .Java
Public Class CeckTreeCellrenderer Extens JPanel реализует TreeCellRenderer {Private ChectReeselectionModel SelectionModel; Частный делегат Treecellrenderer; // private tristatecheckbox facebox = new Tristatecheckbox (); Private JCHECKBOX F -FACE = NEW JCHECKBOX (); public checttreecellrenderer (Treecellrendererer, KecttreelectionModel SelectionModel) {this.Delegate = делегат; this.selectionModel = selectionModel; setlayout (new Borderlayout ()); setoPaque (false); CHACEBOX.SetOpaque (false); } public Component getTreeCellRendererComponent (дерево Jtree, значение объекта, выбранное логическое, логическое расширение, логический лист, int row, boolean hasfocus) {компонент рендерер = делегат. Treepath Path = tree.getPathForrow (ряд); if (path! = null) {System.out.println (path); if (selectionmodel.ispathsected (path, true)) checkbox.setselected (true); else {System.out.println (selectionModel.partiallySelected (path)); Facebox.SetSelected (selectionModel.partivaliallysected (path)? True: false); }} removeall (); добавить (флажок, borderlayout.west); Добавить (рендерер, borderlayout.center); вернуть это; }} 4. Использование
Checktremanager checttreemanager = new checktremanager (jtree);
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.