Java 单个复选框节点树中的两种类型的节点

Java 单个复选框节点树中的两种类型的节点,java,swing,editor,jtree,Java,Swing,Editor,Jtree,我需要在一棵树中渲染两种类型的节点 父节点和叶节点 我还需要编辑它们 CheckBoxNodeernder如下所示: public JCheckBox leafRenderer; public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { C

我需要在一棵树中渲染两种类型的节点

父节点和叶节点

  • 我还需要编辑它们

  • CheckBoxNodeernder如下所示:

    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;
    }
    
    编辑如下:

    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;
    }
    
    我在这里一直面临着一个独特的问题。 当我选择父节点并选择其他节点时,会为父节点设置其他节点的值。 有线索吗?
    我在这里犯了什么错误?

    看起来您的自定义TreeCellEditor重用了自定义TreeCellRenderer返回的组件,对吗?对我来说,这似乎是一个坏习惯。TreeCellRenderer的默认基于JLabel的实现使用单个JLabel来呈现一个大型树-因此,即使树有1000个节点,也只需要一个JLabel实例。如果在显示编辑器时重用此组件,将导致图形异常


    我的建议是更改TreeCellEditor实现,以返回与TreeCellRenderer使用的组件不同的组件。

    看起来您的自定义TreeCellEditor重用了从自定义TreeCellRenderer返回的组件,对吗?对我来说,这似乎是一个坏习惯。TreeCellRenderer的默认基于JLabel的实现使用单个JLabel来呈现一个大型树-因此,即使树有1000个节点,也只需要一个JLabel实例。如果在显示编辑器时重用此组件,将导致图形异常


    我的建议是更改TreeCellEditor实现,以返回与TreeCellRenderer使用的组件不同的组件。

    您能给我一个如何实现的片段吗?您能给我一个如何实现的片段吗?