Редактор для соответствующего рендерера, Check Box Node Tree - PullRequest
1 голос
/ 07 февраля 2012

Я визуализировал флажок дерева узлов. Средство визуализации отображает родительские узлы с помощью (флажок + папка, как значок) и конечные узлы как (только флажок).

Я сделал это, и теперь я хочу сделать его редактируемым. (т. е.) когда я щелкаю по нему, флажки должны быть отмечены и сняты.

Я пытался написать редактор. Но мне не ясно, как это написать. Пожалуйста, объясните мне, как этого добиться.

Большое спасибо заранее.

Я построил дерево из вектора. Вектор называется 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;
        }

1 Ответ

0 голосов
/ 07 февраля 2012

Проблема в том, что вы не слушаете события. В вашем методе getTreeCellRendererComponent создайте прослушиватель, а затем обязательно сообщите модели дерева, что вы изменили узел с помощью метода nodeChanged. Следующее должно работать (вам, возможно, придется сделать некоторые переменные окончательными, чтобы использовать их во внутреннем классе):

check.addMouseListener(new MouseAdapter() {
  public void mouseClicked(MouseEvent ev) {
    checkNode.setSelected(check.isSelected());
    DefaultTreeModel dtm = (DefaultTreeModel)tree.getModel();
    dtm.nodeChanged(node);
  }
});
...