Добавление дочерних узлов в SelectionPaths[]
У меня есть дерево, отображающее сетевые устройства. Дерево фильтруется так, что устройства отображаются по местоположению и типу устройства. Например, узел "Офис" будет иметь дочерний узел "Компьютер" и "Принтер", каждый с устройствами под ними.
Когда я выбираю узел расположения, я хотел бы выделить все узлы под ним и добавить его в selectionPaths[] моего дерева, чтобы они все были выделены. Ниже мой код, но я не могу понять, как заставить это работать.
private class DefaultDeviceTreeCellRenderer extends DefaultTreeCellRenderer {
private JLabel label;
DefaultDeviceTreeCellRenderer() {
super();
label = new JLabel();
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Object o = node.getUserObject();
if (o instanceof DefaultDevice) {
DefaultDevice defaultDevice = (DefaultDevice) o;
label.setIcon(defaultDevice.getIcon());
label.setText(defaultDevice.toString());
} else {
System.out.println("Cell Class= " + o.getClass());
//Set all children of this Component as selected.
label.setIcon(null);
label.setText("" + value);
TreePath[] selectionPaths = tree.getSelectionPaths();
if (selectionPaths == null) {
System.out.println("Nothing Selected. ");
} else {
//keep current selection path
//if there are leaf nodes, add their selection paths.
int i = 0;
while (i < node.getChildCount()) {
//add node.getNextLeaf().getPath() to selection Paths
ArrayList<TreePath> arrayList = new ArrayList<>(Arrays.asList(selectionPaths));
arrayList.add(new TreePath(((DefaultMutableTreeNode)node.getChildAt(i)).getPath()));
TreePath[] toArray = arrayList.toArray(new TreePath[arrayList.size()]);
this.printSelectionPath(selectionPaths);
this.printSelectionPath(toArray);
// tree.setSelectionPaths(toArray);
i++;
}
}
// System.out.println("Selection Paths.size="+selectionPaths.length);
// ArrayList arrayList = new ArrayList(Arrays.asList(selectionPaths));
// System.out.println("ChildNode Path=" + node.getPath()[a]);
}
label.setOpaque(true);
if (selected) {
label.setBackground(this.backgroundSelectionColor);
label.setForeground(this.textSelectionColor);
} else {
label.setBackground(this.backgroundNonSelectionColor);
label.setForeground(this.textNonSelectionColor);
}
return label;
}
private void printSelectionPath(TreePath[] selectionPaths) {
System.out.println("\nTreePath:");
for (int i = 0; i < selectionPaths.length; i++) {
System.out.println("Selection Path= " + selectionPaths[i]);
//TreePath treePath = new TreePath(node.getPath());
// System.out.println("TreePath= " + treePath);
}
}
1 ответ
Я сделал это, расширив DefaultTreeSelectionModel и изменив несколько методов. Вот мой расширенный класс.
public static class MyTreeSelectionModel extends DefaultTreeSelectionModel {
public MyTreeSelectionModel() {
super();
}
@Override
public void removeSelectionPath(TreePath path) {
//remove path and its children
Object lastPathComponent = path.getLastPathComponent();
ArrayList<TreePath> childPaths = new ArrayList();
if (lastPathComponent instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode dn = (DefaultMutableTreeNode) lastPathComponent;
this.getDecendents(dn, childPaths);
} else {
System.out.println("Not a DefaultMutableTreeNode");
}
childPaths.add(path);
this.removeSelectionPaths(childPaths.toArray(new TreePath[childPaths.size()]));
}
@Override
public void addSelectionPath(TreePath path) {
//add the path and its children
Object lastPathComponent = path.getLastPathComponent();
ArrayList<TreePath> childPaths = new ArrayList();
if (lastPathComponent instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode dn = (DefaultMutableTreeNode) lastPathComponent;
System.out.println("Last Path Component= " + dn);
//get decendents
this.getDecendents(dn, childPaths);
} else {
System.out.println("Not a DefaultMutableTreeNode");
}
childPaths.add(path);
this.addSelectionPaths(childPaths.toArray(new TreePath[childPaths.size()]));
// super.addSelectionPath(path); //To change body of generated methods, choose Tools | Templates.
}
private void getDecendents(DefaultMutableTreeNode dn, ArrayList<TreePath> childPaths) {
Enumeration children = dn.children();
if (children != null) {
while (children.hasMoreElements()) {
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) children.nextElement();
System.out.println("Adding " + childNode);
TreeNode[] path1 = childNode.getPath();
childPaths.add(new TreePath(path1));
getDecendents(childNode, childPaths);
}
}
}
}