2012-02-07 80 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