Dieser Artikel teilt den spezifischen Code mit dem Kontrollkästchen Java Jtree JCheckbox für Ihre Referenz. Der spezifische Inhalt ist wie folgt
1. CheckTreemanager.java
public class checkTreemanager erweitert MouseAdapter implementiert BreeSelectionListener {private checktreeSeLectionModel SelectionModel = null; // private jtree tree = new Jtree (); Privat JTREE TREE = NULL; int hotspot = new jCheckbox (). getPreferredSize (). Breite; public checkTreemanager (jtree tree) {this.tree = tree; SelectionModel = new checkTreeSelectionModel (Tree.getModel ()); tree.setCellRenderer (neuer checkTreeCellRenderer (Tree.getCellRenderer (), SelectionModel)); tree.addmouselistener (dies); // Maushörer -Auswahlmodel.AddreeSelectionListener (dies); // Baumauswahl zuhören} public void mouseclicked (mouseEvent me) {treepath path = tree.getPathforLocation (me.getX (), me.gety ()); if (path == null) return; if (me.getX ()> tree.getPathbounds (Pfad) .x+Hotspot) return; boolean selected = SelectionModel.ispathSelected (Pfad, wahr); SelectionModel.RemoveSeSelectionListener (this); try {if (ausgewählt) SelectionModel.RemoveSeLectionPath (Pfad); sonst selectionModel.addSelectionPath (Pfad); } endlich {SelectionModel.AddreeSelectionListener (this); Tree.TreedidChange (); }} public checkTreeSelectionModel getSelectionModel () {return SelectionModel; } public void Valuechanged (bleeSelectionEvent e) {Tree.TreedidChange (); }} 2.ChecktreeSelectionModel.java
public class checktreeSeLectionModel erweitert DefaultTreeSelectionModel {Private Treemodel -Modell; public checkTreeSelectionModel (Treemodel -Modell) {this.model = Modell; setSelectionMode (treeSelectionModel.discontiguous_Tree_Selection); } // Testen Sie, ob sich im Unterbaum eines bestimmten Pfades einen nicht ausgewählten Knoten im öffentlichen booleschen ispartial ausgewählten (Treepath -Pfad) {if (isPadSelected (Pfad, wahr)) zurücksetzen; Treepath [] SelectionPaths = getSelectionPaths (); if (SelectionPaths == null) return false; für (int j = 0; j <selectionPaths.length; j ++) {if (isDescendant (SelectionPaths [j], Pfad)) return true; } return false; } // sagt, ob der angegebene Pfad ausgewählt ist. // Wenn Dig wahr ist, wird angenommen, dass ein Pfad ausgewählt wird, wenn einer seiner Vorfahren ausgewählt wird. public boolean isPathSelected (Treepath Path, boolean dig) {if (! dig) return super.ispathSelected (Pfad); while (Pfad! Rückweg! = null; } // ist Path1 -Nachkomme von Path2 Private boolean isDescendant (Treepath Path1, Treepath Path2) {Objekt obj1 [] = path1.getPath (); Objekt obj2 [] = path2sgetPath (); für (int i = 0; i <obj2.Length; i ++) {if (obj1 [i]! = obj2 [i]) return false; } Return true; } public void setSelectionPaths (treepath [] paths) {neue nicht unterstützte Operationsexception werfen ("Noch nicht implementiert !!!"); } public void addSelectionPaths (treepath [] Pfade) {// alle Nachkommen von Pfaden [] für (int i = 0; i <paths.length; i ++) {treepath path = paths [i] nicht ausgewählt; Treepath [] SelectionPaths = getSelectionPaths (); if (SelectionPaths == null) brechen; ArrayList tOberemoved = new ArrayList (); für (int j = 0; j <selectionPaths.length; j ++) {if (isDescendant (SelectionPaths [j], Pfad)) tuberemoved.add (SelectionPaths [j]); } super.removeselectionPaths ((Treepath []) toberemoved.Orray (neuer Treepath [0]); } // Wenn alle Geschwister ausgewählt werden, wählen Sie sie ab und wählen Sie übergeordnetes übergeordnet // Otherwize wählen Sie nur diesen Pfad aus. für (int i = 0; i <paths.length; i ++) {treepath path = paths [i]; Treepath Temp = NULL; while (aresiblingsSelected (Pfad)) {temp = path; if (path.getParentPath () == null) break; path = path.getParentPath (); } if (temp! = null) {if (temp.getParentPath ()! = null) addSelectionPath (temp.getParentPath ()); sonst {if (! isSelectionEmpty ()) removeSelectionPaths (getSelectionPaths ()); super.addSelectionPaths (neuer Treepath [] {temp}); }} else super.addSelectionPaths (neuer Treepath [] {Path}); }} // sagt, ob alle Geschwister des bestimmten Pfades ausgewählt sind. private boolean aresiblingsSelected (treepath path) {treepath parent = path.getPathPath (); if (parent == null) return true; Object node = path.getLastPathComponent (); Object parentNode = parent.getLastPathComponent (); int childCount = model.getChildCount (parentNode); für (int i = 0; i <ChildCount; i ++) {Object childnode = model.getCild (parentNode, i); if (childnode == node) fortfahren; if (! isPathSelected (Elternteil.PathbyaddingChild (Childnode))) return falsch; } Return true; } public void removeSelectionPaths (treepath [] Pfade) {für (int i = 0; i <paths.length; i ++) {treepath path = paths [i]; if (path.getPathcount () == 1) Super.RemoveselectionPaths (neuer Treepath [] {Path}); sonst Toggleremoveselection (Pfad); }} // Wenn ein Vorfahrknoten des angegebenen Pfades ausgewählt ist, ist es abgewählt // und alle seine Nachkommen ausgewählt, außer gegebenen Pfad und Nachkommen. // Ansonsten nur den angegebenen Pfad private void ToggleremoveSelection (Treepath -Pfad) {Stack Stack = new Stack (); Treepath parent = path.getParentPath (); while (Eltern! parent = parent.getParentPath (); } if (parent! = null) stack.push (Elternteil); sonst {super.removeselectionPaths (neuer Treepath [] {Path}); zurückkehren; } while (! stack.isempty ()) {treepath temp = (treepath) stack.pop (); Treepath peekpath = stack.isempty ()? Pfad: (Treepath) stack.peek (); Object node = temp.getLastPathComponent (); Objekt peeknode = peekPath.getLastPathComponent (); int childCount = model.getChildCount (Knoten); für (int i = 0; i <ChildCount; i ++) {Object childnode = model.getchild (node, i); if (childnode! = peeKnode) super.addSelectionPaths (neuer Treepath [] {temp.PathByAddingChild (childnode)}); }} super.removeSectionPaths (neuer Treepath [] {Parent}); }} 3. CheckTreeCellRenderer .Java
public class checkTreecellrenderer erweitert JPanel implementiert TreecellRenderer {private checktreeSelectionModel SelectionModel; privater Treecellrenderer -Delegierter; // private tristatecheckBox CheckBox = new TristatecheckBox (); private jCheckbox CheckBox = new JCheckbox (); public checkTreeCellRenderer (TreecellRenderer -Delegierter, ChecktreeSelectionModel SelectionModel) {this.delegate = delegate; this.SelectionModel = SelectionModel; setLayout (neuer BorderLayout ()); setopaque (falsch); CheckBox.Setopaque (Falsch); } öffentliche Komponenten getTreeCellRendererComponent (JTREE TREE, Objektwert, boolean ausgewählt, boolean erweitert, boolean blätter, int row, boolean hasfocus) {component renderer = delegate.GetReeCellrendererComponent (Baum, Wert, ausgewählt, erweitert, blatt, row, uw, uw, tefocus); Treepath path = tree.getPathForrow (Reihe); if (path! = null) {system.out.println (path); if (selectionModel.ispathSelected (path, true)) CheckBox.SetSelected (true); sonst {system.out.println (SelectionModel.ispartialSelected (Pfad)); CheckBox.SetSelected (SelectionModel.ispartial ausgewählt (Pfad)? Richtig: false); }} removeAll (); Add (Kontrollkästchen, BorderLayout.West); add (Renderer, BorderLayout.Center); gib dies zurück; }} 4. Nutzung
CheckTreemanager checkTreemanager = new checkTreemanager (jTree);
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.