Два типа узлов в одном флажке Дерево узлов - PullRequest
1 голос
/ 31 января 2012
  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;
}

Я столкнулся с уникальной проблемойВот .Когда я выбираю родительский узел и выбираю какой-то другой узел, значение другого узла устанавливается для родительского узла.Какие-либо ведет?Какую ошибку я здесь делаю?

1 Ответ

1 голос
/ 01 февраля 2012

Похоже, у вас есть настроенный TreeCellEditor, повторно использующий компоненты, возвращенные из настроенного TreeCellRenderer, это правильно? Это кажется плохой практикой для меня. Стандартная реализация TreeCellRenderer на основе JLabel использует один JLabel для рендеринга большого дерева, поэтому даже если в дереве 1000 узлов, необходим только один экземпляр JLabel. Если вы повторно используете этот компонент при отображении вашего редактора, это приведет к графическим аномалиям.

Я бы рекомендовал изменить реализацию TreeCellEditor, чтобы она возвращала компонент, отличный от того, который используется для вашего TreeCellRenderer.

...