Java 对应渲染器的编辑器,选中“节点树”

Java 对应渲染器的编辑器,选中“节点树”,java,swing,checkbox,jtree,Java,Swing,Checkbox,Jtree,我渲染了一个复选框节点树。 渲染器使用(复选框+类似文件夹的图标)渲染父节点,将叶节点渲染为(仅复选框) 我已经渲染了它,现在我想使其可编辑。(即)当我单击它时,必须选中并取消选中复选框 我试着写一个编辑。但我不清楚怎么写。请指导我如何做到这一点 非常感谢 我已经用矢量建立了这棵树。该向量称为NamedVector,它包含父节点对象。父节点对象保存叶节点。叶节点的类型为CheckBoxNode public class CheckBoxNodeRenderer implements TreeC

我渲染了一个复选框节点树。 渲染器使用(复选框+类似文件夹的图标)渲染父节点,将叶节点渲染为(仅复选框)

我已经渲染了它,现在我想使其可编辑。(即)当我单击它时,必须选中并取消选中复选框

我试着写一个编辑。但我不清楚怎么写。请指导我如何做到这一点

非常感谢

我已经用矢量建立了这棵树。该向量称为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;
        }

问题是你没有在听这些事件。在GetTreeCellRenderComponent方法中,创建一个侦听器,然后确保通过nodeChanged方法告诉树模型您已经更改了节点。以下应该可以工作(但您可能必须使一些变量成为最终变量,以便在内部类中使用它们):


您是否尝试过扩展DefaultTreeCellRenderer?我通常会这样做,而不是实现TreeCellRenderer接口,这会免费为您提供很多。我基本上做了一些和你非常相似的事情,这对我很有用。子类和接口是唯一的区别。但是defaultTreeCellRenderer将父节点呈现为图标。我想要父节点的复选框和图标。这就是我选择自定义渲染器的原因。但是您已经实现了GetTreeCellRenderComponent()方法,以便您的代码将其呈现。-1对于在呈现器中呈现侦听器的建议-这完全是错误的事情,根本不起作用:呈现器是完全被动的,在任何时候都不是容器层次结构的一部分,我通过按照我的规范呈现它,并在呈现器外部设置侦听器。
check.addMouseListener(new MouseAdapter() {
  public void mouseClicked(MouseEvent ev) {
    checkNode.setSelected(check.isSelected());
    DefaultTreeModel dtm = (DefaultTreeModel)tree.getModel();
    dtm.nodeChanged(node);
  }
});