2012-01-31 90 views
1
  1. 我需要在单个树中呈现两种类型的节点。单个复选框节点树中的两种节点类型

    父节点和叶节点。

  2. 我也需要编辑它们两个。

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

我一直在这里面临着一个独特的问题。 当我选择父节点并选择其他节点时,为父节点设置另一个节点的值。 任何线索? 我在这里做什么错误?

回答

1

它看起来像你有自定义的TreeCellEditor重复使用从你自定义的TreeCellRenderer返回的组件,这是否正确?这对我来说似乎是一个不好的习惯。 TreeCellRenderer的默认基于JLabel的实现使用单个JLabel来渲染大型树 - 所以即使树有1,000个节点,也只需要一个JLabel实例。如果在显示编辑器时重复使用该组件,则会导致图形异常。

我的建议是改变你的TreeCellEditor实现来返回一个不同于你的TreeCellRenderer所使用的组件。

+0

你能给我一个片段,我怎么能做到这一点? – Achilles 2012-02-02 04:11:45