2012-01-31 124 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