2012-02-07 9 views
1

J'ai rendu une arborescence de noeuds de case à cocher. Le moteur de rendu restitue les nœuds parents avec (case à cocher + icône de type dossier) et les nœuds feuilles comme (case à cocher Uniquement).Editeur pour le moteur de rendu correspondant, case à cocher Noeud de la case à cocher

Je l'ai rendu et maintenant je veux le rendre éditable. (c'est-à-dire) lorsque je clique dessus, les cases à cocher doivent être cochées et non cochées.

J'ai essayé d'écrire un éditeur. Mais je ne suis pas clair quant à la façon de l'écrire. S'il vous plaît me guider sur la façon d'accomplir cela.

Merci beaucoup à l'avance.

J'ai construit l'arbre à partir d'un vecteur. Le vecteur s'appelle NamedVector et contient des objets de noeud Parent. L'objet nœud parent contient les nœuds feuille. Les nœuds feuilles sont de type 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; 
     } 

Répondre

0

Le problème est que vous n'écoutez pas les événements. Dans votre méthode getTreeCellRendererComponent, créez un écouteur, puis assurez-vous de dire au modèle d'arbre que vous avez modifié un nœud via la méthode nodeChanged. Ce qui suit devrait fonctionner (vous pourriez avoir à faire quelques variables finales de les utiliser dans la classe intérieure bien):

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

Je l'ai essayé et le même résultat encore une fois. N'arrive pas . – Achilles

+0

Avez-vous essayé d'étendre le DefaultTreeCellRenderer? Je le fais normalement plutôt que d'implémenter l'interface TreeCellRenderer, vous en donne beaucoup gratuitement. Je fais essentiellement quelque chose de très similaire à ce que vous avez et cela fonctionne pour moi. La sous-classe par rapport à l'interface est vraiment la seule différence. – Michael

+0

Mais defaultTreeCellRenderer restitue le nœud parent sous la forme d'une icône. Je veux à la fois la case à cocher et l'icône pour les nœuds parents. C'est la raison pour laquelle je suis allé pour un moteur de rendu personnalisé. – Achilles