Java Swing How to - Create non-selectable DefaultTreeModel node with children








Question

We would like to know how to create non-selectable DefaultTreeModel node with children.

Answer

import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
/*from w  ww.  j a v a 2  s. co m*/
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);
  }

}