2012-02-07 78 views
1

我渲染了一個複選框節點樹。 渲染器使用(複選框+文件夾如圖標)和葉節點(僅複選框)呈現父節點。編輯器爲相應的渲染器,複選框節點樹

我已經呈現它,現在我想讓它可編輯。 (即)當我點擊它時,複選框必須選中並取消選中。

我試着寫一個編輯器。但我不清楚如何編寫它。請指導我如何做到這一點。

非常感謝提前。

我已經從Vector構建了樹。該向量稱爲NamedVector,它包含父節點對象。父節點對象保存葉節點。葉節點的類型是CheckBoxNode。

public class CheckBoxNodeRenderer implements TreeCellRenderer{ 
NonLeafRenderer nonLeafRenderer = new NonLeafRenderer(); 
protected JCheckBox check; 
protected JLabel label; 
public JPanel panel; 
CheckBoxNode checkNode; 
public JCheckBox getLeafRenderer() 
{ 
    return leafRenderer; 
} 
public CheckBoxNodeRenderer() 
{ 
    panel = new JPanel(); 
    panel.setLayout(new BorderLayout()); 
    check = new JCheckBox(); 
    label = new JLabel(); 
    Font fontValue; 
    fontValue = UIManager.getFont("Tree.font"); 
    if (fontValue != null) { 
     leafRenderer.setFont(fontValue); 
    } 
    Boolean booleanValue = (Boolean) UIManager 
    .get("Tree.drawsFocusBorderAroundIcon"); 
    leafRenderer.setFocusPainted((booleanValue != null) 
      && (booleanValue.booleanValue())); 
    selectionBorderColor = UIManager.getColor("Tree.selectionBorderColor"); 
    selectionForeground = UIManager.getColor("Tree.selectionForeground"); 
    selectionBackground = UIManager.getColor("Tree.selectionBackground"); 
    textForeground = UIManager.getColor("Tree.textForeground"); 
    textBackground = UIManager.getColor("Tree.textBackground"); 
} 

/////////////////// 
/** 
* Approach by returning a panel . 
*/ 
public Component getTreeCellRendererComponent(JTree tree, Object value, 
     boolean isSelected, boolean expanded, 
     boolean leaf, int row, boolean hasFocus) { 
      String stringValue = tree.convertValueToText(value, isSelected, 
        expanded, leaf, row, hasFocus); 
        panel.setEnabled(true); 
        if(leaf){ 
         if ((value != null) && (value instanceof DefaultMutableTreeNode)) { 
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; 


         checkNode = (CheckBoxNode)node.getUserObject(); 
         check.setSelected(checkNode.isSelected()); 
         label.setFont(tree.getFont()); 
         label.setText(value.toString()); 
         label.setIcon(null); 
         panel.removeAll(); 
         panel.add(check,BorderLayout.WEST); 
         panel.add(label); 
         panel.setVisible(true); 
        } 
        } 


else if(!leaf){ 
      if ((value != null) && (value instanceof DefaultMutableTreeNode)) { 
      DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; 

      Object parent = (Object)node.getUserObject(); 
      System.err.println(parent.toString()); 

      NamedVector parentNode = (NamedVector) parent; 
      check.setSelected(parentNode.isSelected()); 
      label.setFont(tree.getFont()); 
      label.setText(parentNode.toString()); 
      label.setIcon(UIManager.getIcon("Tree.openIcon")); 
      panel.removeAll(); 
     panel.add(check,BorderLayout.WEST); 
     panel.add(label); 
     panel.setVisible(true); 
      } 
     } 
     return panel; 
     } 

回答

0

問題在於你沒有聽取事件。在你的getTreeCellRendererComponent方法中,創建一個監聽器,然後確保通過nodeChanged方法告訴樹模型你已經改變了一個節點。下面的工作(你可能需要做一些變量最後在內部類中使用它們):

check.addMouseListener(new MouseAdapter() { 
    public void mouseClicked(MouseEvent ev) { 
    checkNode.setSelected(check.isSelected()); 
    DefaultTreeModel dtm = (DefaultTreeModel)tree.getModel(); 
    dtm.nodeChanged(node); 
    } 
}); 
+0

我試過了,並且再次得到相同的結果。沒有發生 。 – Achilles 2012-02-07 03:47:24

+0

你有沒有試過擴展DefaultTreeCellRenderer?我通常這樣做,而不是實現TreeCellRenderer接口,給你很多免費的。我基本上做了一些與你所擁有的非常相似的東西,這對我來說很有用。子類與界面是唯一的區別。 – Michael 2012-02-07 03:53:22

+0

但defaultTreeCellRenderer將父節點呈現爲一個圖標。我想要複選框和父節點的圖標。這就是我去自定義渲染器的原因。 – Achilles 2012-02-07 03:55:31