【问题标题】:Two Type of Nodes in a Single Check Box Node Tree单个复选框节点树中的两种类型的节点
【发布时间】:2012-02-23 06:06:42
【问题描述】:
  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;
}

我在这里遇到了一个独特的问题。 当我选择父节点并选择其他节点时,将为父节点设置其他节点的值。 有什么线索吗? 我在这里犯了什么错误?

【问题讨论】:

    标签: java swing editor jtree


    【解决方案1】:

    看起来您的自定义 TreeCellEditor 重用了从自定义 TreeCellRenderer 返回的组件,对吗?这对我来说似乎是一个不好的做法。 TreeCellRenderer 的默认基于 JLabel 的实现使用单个 JLabel 来渲染一棵大树 - 因此即使树有 1,000 个节点,也只需要一个 JLabel 实例。如果您在显示编辑器时重用此组件,则会导致图形异常。

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

    【讨论】:

    • 你能告诉我怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2012-02-23
    相关资源
    最近更新 更多