基本上要改变树的节点的显示方式就是实现TreeCellRenderer,如果要改变编辑的方式就要实现 TreeCellEditor,实现方法和TreeCellRenderer非常相似.
public class TagCheckRenderer extends JCheckBox implements TreeCellRenderer{
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus){
String stringValue = tree.convertValueToText(value, selected,
expanded, leaf, row, hasFocus);
TagCheckNode node = (TagCheckNode)value;
if(!node.isEditable()){
JLabel label = new JLabel(stringValue);
label.setComponentOrientation(tree.getComponentOrientation());
if(hasFocus||node.isSelected()){
label.setBackground(UIManager.getColor("Tree.selectionBackground");
}
else{
label.setBackground(tree.getBackground());
}
return label;
}
this.setText(stringValue);
if(!leaf){
this.setEnabled(false);
this.setSelected(false);
TagCheckNode child = null;
//只要有一个叶子子节点Tag被选中,该节点就为被选中的状态
for(Enumeration enum = node.children(); enum.hasMoreElements() {
child = (TagCheckNode)enum.nextElement();
if(child.isLeaf()&&child.isSelected()){
this.setSelected(true);
break;
}
}
}
else{
this.setSelected(node.isSelected());
this.setEnabled(tree.isEnabled());
}
if(hasFocus){
this.setBackground(UIManager.getColor("Tree.selectionBackground");
}
else{
this.setBackground(tree.getBackground());
}
this.setComponentOrientation(tree.getComponentOrientation());
return this;
}
}
public class TagCheckRenderer extends JCheckBox implements TreeCellRenderer{
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean selected,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus){
String stringValue = tree.convertValueToText(value, selected,
expanded, leaf, row, hasFocus);
TagCheckNode node = (TagCheckNode)value;
if(!node.isEditable()){
JLabel label = new JLabel(stringValue);
label.setComponentOrientation(tree.getComponentOrientation());
if(hasFocus||node.isSelected()){
label.setBackground(UIManager.getColor("Tree.selectionBackground");
}
else{
label.setBackground(tree.getBackground());
}
return label;
}
this.setText(stringValue);
if(!leaf){
this.setEnabled(false);
this.setSelected(false);
TagCheckNode child = null;
//只要有一个叶子子节点Tag被选中,该节点就为被选中的状态
for(Enumeration enum = node.children(); enum.hasMoreElements() {
child = (TagCheckNode)enum.nextElement();
if(child.isLeaf()&&child.isSelected()){
this.setSelected(true);
break;
}
}
}
else{
this.setSelected(node.isSelected());
this.setEnabled(tree.isEnabled());
}
if(hasFocus){
this.setBackground(UIManager.getColor("Tree.selectionBackground");
}
else{
this.setBackground(tree.getBackground());
}
this.setComponentOrientation(tree.getComponentOrientation());
return this;
}
}