Java tutorial
import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.RowMapper; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; public class Main { private static void fillTree(DefaultMutableTreeNode parent, int level, String label) { for (int i = 0; i < 5; i++) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(label + " " + i); parent.add(node); if (level > 0) { fillTree(node, level - 1, label); } } } public static void main(String[] args) { final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); fillTree(root, 5, "Tree label"); final DefaultTreeModel model = new DefaultTreeModel(root); JTree tree = new JTree(model); tree.setSelectionModel(new MyTreeSelectionModel()); JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new JScrollPane(tree)); f.setSize(400, 600); f.setVisible(true); } } class MyTreeSelectionModel implements TreeSelectionModel { TreeSelectionModel selectionModel = new DefaultTreeSelectionModel(); private boolean canPathBeAdded(TreePath treePath) { return treePath.getPathCount() > 2; } private TreePath[] getFilteredPaths(TreePath[] paths) { List<TreePath> returnedPaths = new ArrayList<TreePath>(paths.length); for (TreePath treePath : paths) { if (canPathBeAdded(treePath)) { returnedPaths.add(treePath); } } return returnedPaths.toArray(new TreePath[returnedPaths.size()]); } @Override public void setSelectionMode(int mode) { selectionModel.setSelectionMode(mode); } @Override public int getSelectionMode() { return selectionModel.getSelectionMode(); } @Override public void setSelectionPath(TreePath path) { if (canPathBeAdded(path)) { selectionModel.setSelectionPath(path); } } @Override public void setSelectionPaths(TreePath[] paths) { paths = getFilteredPaths(paths); selectionModel.setSelectionPaths(paths); } @Override public void addSelectionPath(TreePath path) { if (canPathBeAdded(path)) { selectionModel.addSelectionPath(path); } } @Override public void addSelectionPaths(TreePath[] paths) { paths = getFilteredPaths(paths); selectionModel.addSelectionPaths(paths); } @Override public void removeSelectionPath(TreePath path) { selectionModel.removeSelectionPath(path); } @Override public void removeSelectionPaths(TreePath[] paths) { selectionModel.removeSelectionPaths(paths); } @Override public TreePath getSelectionPath() { return selectionModel.getSelectionPath(); } @Override public TreePath[] getSelectionPaths() { return selectionModel.getSelectionPaths(); } @Override public int getSelectionCount() { return selectionModel.getSelectionCount(); } @Override public boolean isPathSelected(TreePath path) { return selectionModel.isPathSelected(path); } @Override public boolean isSelectionEmpty() { return selectionModel.isSelectionEmpty(); } @Override public void clearSelection() { selectionModel.clearSelection(); } @Override public void setRowMapper(RowMapper newMapper) { selectionModel.setRowMapper(newMapper); } @Override public RowMapper getRowMapper() { return selectionModel.getRowMapper(); } @Override public int[] getSelectionRows() { return selectionModel.getSelectionRows(); } @Override public int getMinSelectionRow() { return selectionModel.getMinSelectionRow(); } @Override public int getMaxSelectionRow() { return selectionModel.getMaxSelectionRow(); } @Override public boolean isRowSelected(int row) { return selectionModel.isRowSelected(row); } @Override public void resetRowSelection() { selectionModel.resetRowSelection(); } @Override public int getLeadSelectionRow() { return selectionModel.getLeadSelectionRow(); } @Override public TreePath getLeadSelectionPath() { return selectionModel.getLeadSelectionPath(); } @Override public void addPropertyChangeListener(PropertyChangeListener listener) { selectionModel.addPropertyChangeListener(listener); } @Override public void removePropertyChangeListener(PropertyChangeListener listener) { selectionModel.removePropertyChangeListener(listener); } @Override public void addTreeSelectionListener(TreeSelectionListener x) { selectionModel.addTreeSelectionListener(x); } @Override public void removeTreeSelectionListener(TreeSelectionListener x) { selectionModel.removeTreeSelectionListener(x); } }