package demo;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.event.CellEditorListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellEditor;
public class TreeButtonEditorRendererDemo extends JFrame {
private JTree tree;
private DefaultTreeModel model;
public TreeButtonEditorRendererDemo() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
root.add(new DefaultMutableTreeNode(0));
root.add(new DefaultMutableTreeNode(0));
root.add(new DefaultMutableTreeNode(0));
model = new DefaultTreeModel(root);
tree = new JTree(model);
tree.setCellRenderer(new CustomRenderer(new NodeComponent()));
tree.setCellEditor(new CustomEditor(tree, new NodeComponent()));
tree.setEditable(true);
this.getContentPane().add(tree);
}
class NodeComponent extends JPanel {
private JLabel label;
private JButton button;
public NodeComponent() {
this.setLayout(new GridLayout(1, 2));
add(button = new JButton("+"));
add(label = new JLabel("", JLabel.RIGHT));
}
public void setValue(String text) {
label.setText(text);
}
public Object getValue() {
return label.getText();
}
public void increase() {
label.setText("" + (Integer.parseInt(label.getText())+1));
}
public void addActionListener(ActionListener listener) {
button.addActionListener(listener);
}
}
class CustomRenderer extends DefaultTreeCellRenderer {
private NodeComponent nodePanel;
public CustomRenderer(NodeComponent comp) {
nodePanel = comp;
}
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, selected, expanded,
leaf, row, hasFocus);
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value;
if (treeNode.isLeaf()) {
nodePanel.setValue(treeNode.getUserObject().toString());
nodePanel.setBackground(super.getBackground());
return nodePanel;
}
this.setIcon(null);
return this;
}
}
class CustomEditor implements TreeCellEditor, ActionListener {
private JTree tree;
private NodeComponent nodePanel;
public CustomEditor(JTree tree, NodeComponent comp) {
this.tree = tree;
this.nodePanel = comp;
this.nodePanel.addActionListener(this);
}
public void actionPerformed(ActionEvent evt) {
nodePanel.increase();
tree.stopEditing();
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row) {
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value;
if (treeNode.isLeaf()) {
nodePanel.setValue(treeNode.getUserObject().toString());
return nodePanel;
}
return tree.getCellRenderer().getTreeCellRendererComponent(tree,
value, true, true, false, row, true);
}
public Object getCellEditorValue() {
return nodePanel.getValue();
}
public boolean isCellEditable(EventObject anEvent) {
return true;
}
public boolean stopCellEditing() {
return true;
}
public void addCellEditorListener(CellEditorListener l) {
}
public void cancelCellEditing() {
}
public void removeCellEditorListener(CellEditorListener l) {
}
public boolean shouldSelectCell(EventObject anEvent) {
return false;
}
}
public static void main(String[] args) {
JFrame frame = new TreeButtonEditorRendererDemo();
frame.setBounds(0, 0, 500, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}