/* * * http://www.jroller.com/santhosh/date/20050610 * Santhosh Kumar T - santhosh@in.fiorano.com * Mit kleiner Erweiterung von mir. (rootClickable) * @SKW05 * */ package op.tools; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JCheckBox; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; public class CheckTreeManager extends MouseAdapter implements TreeSelectionListener { private CheckTreeSelectionModel selectionModel; private JTree tree = new JTree(); int hotspot = new JCheckBox().getPreferredSize().width; private boolean rootClickable; public CheckTreeManager(JTree tree) { this(tree, true); } public CheckTreeManager(JTree tree, boolean rootClickable) { this.tree = tree; tree.setCellRenderer(new DefaultTreeCellRenderer()); // Erweiterung. Damit sich die Renderer bei mehrfachem Aufruf nicht aufaddieren. selectionModel = new CheckTreeSelectionModel(tree.getModel()); tree.setCellRenderer(new CheckTreeCellRenderer(tree.getCellRenderer(), selectionModel)); tree.addMouseListener(this); selectionModel.addTreeSelectionListener(this); this.rootClickable = rootClickable; } @Override public void mouseClicked(MouseEvent me) { TreePath path = tree.getPathForLocation(me.getX(), me.getY()); // Hier hab ich ein bisschen erweitert. Falls man nicht auf den root // Knoten clicken soll. if (path == null || !this.tree.isEnabled() || (!rootClickable && path.getPathCount() == 1)) { return; } if (me.getX() > tree.getPathBounds(path).x + hotspot) { return; } boolean selected = selectionModel.isPathSelected(path, true); selectionModel.removeTreeSelectionListener(this); try { if (selected) { selectionModel.removeSelectionPath(path); } else { selectionModel.addSelectionPath(path); } } finally { selectionModel.addTreeSelectionListener(this); tree.treeDidChange(); } } public CheckTreeSelectionModel getSelectionModel() { return selectionModel; } public void valueChanged(TreeSelectionEvent e) { tree.treeDidChange(); } }