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;
}
}