单个复选框节点树中的两种节点类型
问题描述:
-
我需要在单个树中呈现两种类型的节点。单个复选框节点树中的两种节点类型
父节点和叶节点。
我也需要编辑它们两个。
的CheckBoxNodeRender如下:
public JCheckBox leafRenderer;
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);
if (selected) {
leafRenderer.setForeground(selectionForeground);
leafRenderer.setBackground(selectionBackground);
} else {
leafRenderer.setForeground(textForeground);
leafRenderer.setBackground(textBackground);
}
if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
Object userObject =
((DefaultMutableTreeNode) value).getUserObject();
if (userObject instanceof CheckBoxNode) {
CheckBoxNode node = (CheckBoxNode) userObject;
leafRenderer.setText(node.getText());
System.err.println("Leaf Value = "+node.getText());
leafRenderer.setSelected(node.isSelected());
}
}
returnValue = leafRenderer;
}
else {
// For the Parent Node
leafRenderer.setText(value.toString());
leafRenderer.setSelected(selected);
returnValue = leafRenderer;
}
return returnValue;
}
而且编辑如下:
public boolean isCellEditable(EventObject event) {
//All cells are editable
return true;
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row) {
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;
}
我一直在这里面临着一个独特的问题。 当我选择父节点并选择其他节点时,为父节点设置另一个节点的值。 任何线索? 我在这里做什么错误?
答
它看起来像你有自定义的TreeCellEditor重复使用从你自定义的TreeCellRenderer返回的组件,这是否正确?这对我来说似乎是一个不好的习惯。 TreeCellRenderer的默认基于JLabel的实现使用单个JLabel来渲染大型树 - 所以即使树有1,000个节点,也只需要一个JLabel实例。如果在显示编辑器时重复使用该组件,则会导致图形异常。
我的建议是改变你的TreeCellEditor实现来返回一个不同于你的TreeCellRenderer所使用的组件。
你能给我一个片段,我怎么能做到这一点? – Achilles 2012-02-02 04:11:45