JTree com JCheckBox (Tópico de ajuda aos interessados)

1 resposta
J

Pessoal,

implementei um Renderer e um Editor para criar uma árvore JTree com checkBoxes em cada nó folha. Caso o checkBox seja selecionado, ele é desabilitado. Quem estiver interessado em usar o código é só copiar!

A classe LitologyMutableTreeNode estende de DefaultMutableTreeNode. Ela guarda o objeto de negocio que fica dentro de cada nó. Essa classe deve ter um método isSelected() e setSelected(boolean) para indicar se o nó está ou não selecionado.

public class CheckBoxNodeEditor extends AbstractCellEditor implements
TreeCellEditor {

CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();

ChangeEvent changeEvent = null;
LitologyMutableTreeNode nodeEditor;

final JTree tree;

public CheckBoxNodeEditor(JTree tree) {

this.tree = tree;

}

public Object getCellEditorValue() {

if (nodeEditor != null && nodeEditor.isLeaf())
  nodeEditor.setSelected(!nodeEditor.isSelected());

return nodeEditor;

}

public boolean isCellEditable(EventObject event) {

boolean returnValue = false;

if (event instanceof MouseEvent) {

  MouseEvent mouseEvent = (MouseEvent) event;

  TreePath path =
    tree.getPathForLocation(mouseEvent.getX(), mouseEvent.getY());

  if (path != null) {

    Object node = path.getLastPathComponent();
    if ((node != null) && (node instanceof LitologyMutableTreeNode)) {

      nodeEditor = (LitologyMutableTreeNode) node;

      LitologyMutableTreeNode treeNode = (LitologyMutableTreeNode) node;
      Object userObject = treeNode.getObject();
      returnValue =
        ((treeNode.isLeaf()) && (userObject instanceof SeuObjetoDeNegocio) && (!treeNode
          .isSelected()));
    }
  }
}

return returnValue;

}

public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row) {

final Component editor =
  renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf,
    row, true);

ItemListener itemListener = new ItemListener() {
  public void itemStateChanged(ItemEvent itemEvent) {
    if (stopCellEditing()) {
      fireEditingStopped();
    }
  }
};
if (editor instanceof JCheckBox) {
  ((JCheckBox) editor).addItemListener(itemListener);
}

return editor;

}
}

public class CheckBoxNodeRenderer extends MouseAdapter implements
TreeCellRenderer {

private DefaultTreeCellRenderer nonLeafRenderer =
new DefaultTreeCellRenderer();

private JCheckBox leafRenderer = new JCheckBox();

Color selectionBorderColor, selectionForeground, selectionBackground,
textForeground, textBackground;

protected JCheckBox getLeafRenderer() {

return leafRenderer;

}

public CheckBoxNodeRenderer() {

Font fontValue;
fontValue = UIManager.getFont("Tree.font");

if (fontValue != null) {
  leafRenderer.setFont(fontValue);
}

Boolean booleanValue =
  (Boolean) UIManager.get("Tree.drawsFocusBorderAroundIcon");
leafRenderer.setFocusPainted((booleanValue != null)
  && (booleanValue.booleanValue()));

selectionBorderColor = UIManager.getColor("Tree.selectionBorderColor");
selectionForeground = UIManager.getColor("Tree.selectionForeground");
selectionBackground = UIManager.getColor("Tree.selectionBackground");
textForeground = UIManager.getColor("Tree.textForeground");
textBackground = UIManager.getColor("Tree.textBackground");

}

public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {

Component returnValue;
if (leaf) {

  String stringValue =
    tree.convertValueToText(value, selected, expanded, leaf, row, false);
  leafRenderer.setText(stringValue);
  leafRenderer.setSelected(true);
  leafRenderer.setEnabled(tree.isEnabled());

  if (selected) {

    leafRenderer.setForeground(textForeground);
    leafRenderer.setBackground(textBackground);

  }
  else {

    leafRenderer.setForeground(textForeground);
    leafRenderer.setBackground(textBackground);

  }

  if ((value != null) && (value instanceof LitologyMutableTreeNode)) {

    Object userObject = ((LitologyMutableTreeNode) value).getObject();

    if (userObject instanceof SeuObjetoDeNegocio) {

      SeuObjetoDeNegocio node = (SeuObjetoDeNegocio) userObject;
      leafRenderer.setText(node.getName());
      leafRenderer.setSelected(((LitologyMutableTreeNode) value)
        .isSelected());

      if (leafRenderer.isSelected()) {
        leafRenderer.setEnabled(false);

      }

    }
  }
  returnValue = leafRenderer;
}
else {

  returnValue =
    nonLeafRenderer.getTreeCellRendererComponent(tree, value, selected,
      expanded, leaf, row, hasFocus);
}
return returnValue;

}

}

1 Resposta

juceliohv

O q vem a ser LitologyMutableTreeNode?

Criado 17 de setembro de 2009
Ultima resposta 20 de out. de 2011
Respostas 1
Participantes 2