CheckBox Tree node : JTree Node « Swing « Java Tutorial






import java.awt.Component;

import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreePath;

class TrueFalseTreeNodeData {

  protected final String value;
  protected boolean booleanValue;

  public TrueFalseTreeNodeData(String quest) {
    value = quest;
  }

  public String getQuestion() {
    return value;
  }

  public boolean getAnswer() {
    return booleanValue;
  }

  public void setAnswer(boolean ans) {
    booleanValue = ans;
  }

  public String toString() {
    return value + " = " + booleanValue;
  }
}

public class TreeTest extends JFrame {

  protected final static String[] questions = { "A","B","C" };

  public static void main(String[] args) {
    TreeTest tt = new TreeTest();
    tt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    tt.setSize(500, 200);
    tt.setVisible(true);
  }

  public TreeTest() {
    super();
    JTree tree = new JTree(getRootNode()) {
      public boolean isPathEditable(TreePath path) {
        Object comp = path.getLastPathComponent();
        if (comp instanceof DefaultMutableTreeNode) {
          DefaultMutableTreeNode node = (DefaultMutableTreeNode) comp;
          Object userObject = node.getUserObject();
          if (userObject instanceof TrueFalseTreeNodeData) {
            return true;
          }
        }
        return false;
      }
    };
    QuestionCellRenderer renderer = new QuestionCellRenderer();
    tree.setCellRenderer(renderer);
    QuestionCellEditor editor = new QuestionCellEditor();
    tree.setCellEditor(editor);
    tree.setEditable(true);
    JScrollPane jsp = new JScrollPane(tree);
    getContentPane().add(jsp);
  }

  protected MutableTreeNode getRootNode() {
    DefaultMutableTreeNode root, child;
    TrueFalseTreeNodeData question;
    root = new DefaultMutableTreeNode("Root");
    for (int i = 0; i < questions.length; i++) {
      question = new TrueFalseTreeNodeData(questions[i]);
      child = new DefaultMutableTreeNode(question);
      root.add(child);
    }
    return root;
  }

}

class QuestionCellRenderer extends DefaultTreeCellRenderer {

  protected JCheckBox checkBoxRenderer = new JCheckBox();

  public Component getTreeCellRendererComponent(JTree tree, Object value,
      boolean selected, boolean expanded, boolean leaf, int row,
      boolean hasFocus) {
    if (value instanceof DefaultMutableTreeNode) {
      DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
      Object userObject = node.getUserObject();
      if (userObject instanceof TrueFalseTreeNodeData) {
        TrueFalseTreeNodeData question = (TrueFalseTreeNodeData) userObject;
        prepareQuestionRenderer(question, selected);
        return checkBoxRenderer;
      }
    }
    return super.getTreeCellRendererComponent(tree, value, selected, expanded,
        leaf, row, hasFocus);
  }

  protected void prepareQuestionRenderer(TrueFalseTreeNodeData tfq, boolean selected) {
    checkBoxRenderer.setText(tfq.getQuestion());
    checkBoxRenderer.setSelected(tfq.getAnswer());
    if (selected) {
      checkBoxRenderer.setForeground(getTextSelectionColor());
      checkBoxRenderer.setBackground(getBackgroundSelectionColor());
    } else {
      checkBoxRenderer.setForeground(getTextNonSelectionColor());
      checkBoxRenderer.setBackground(getBackgroundNonSelectionColor());
    }
  }

}

class QuestionCellEditor extends DefaultCellEditor {

  protected TrueFalseTreeNodeData nodeData;

  public QuestionCellEditor() {
    super(new JCheckBox());
  }

  public Component getTreeCellEditorComponent(JTree tree, Object value,
      boolean selected, boolean expanded, boolean leaf, int row) {
    JCheckBox editor = null;
    nodeData = getQuestionFromValue(value);
    if (nodeData != null) {
      editor = (JCheckBox) (super.getComponent());
      editor.setText(nodeData.getQuestion());
      editor.setSelected(nodeData.getAnswer());
    }
    return editor;
  }

  public static TrueFalseTreeNodeData getQuestionFromValue(Object value) {
    if (value instanceof DefaultMutableTreeNode) {
      DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
      Object userObject = node.getUserObject();
      if (userObject instanceof TrueFalseTreeNodeData) {
        return (TrueFalseTreeNodeData) userObject;
      }
    }
    return null;
  }

  public Object getCellEditorValue() {
    JCheckBox editor = (JCheckBox) (super.getComponent());
    nodeData.setAnswer(editor.isSelected());
    return nodeData;
  }

}








14.67.JTree Node
14.67.1.Get child count, depth, leaf count
14.67.2.Adding a Node to a JTree Component
14.67.3.Delete tree node
14.67.4.Removing a Node to a JTree Component
14.67.5.Expression TreeExpression Tree
14.67.6.Swing TreeSwing Tree
14.67.7.JTree node mouse click event
14.67.8.A JTree subclass that displays the tree of AWT or Swing component that make up a GUI
14.67.9.Tree with custom icon
14.67.10.CheckBox Tree node
14.67.11.Get path for all expanded or not expanded tree pathes
14.67.12.Converting All Nodes in a JTree Component to a TreePath Array
14.67.13.Expanding or Collapsing All Nodes in a JTree Component
14.67.14.JTree root cannot be removed with removeNodeFromParent(), use DefaultTreeModel.setRoot() to remove the root
14.67.15.Searching node in a JTree