2010-09-18 3 views
2

J'ai un objet personnalisé qui a une description (String) et une valeur de priorité (int). Je montre ces valeurs dans un JTree parce qu'il y a une relation hiérarchique entre différents objets de ce type. Je n'affiche que la description dans les nœuds JTree car la priorité n'est pas importante pour l'affichage.Comment modifier le comportement d'édition par défaut d'un TreeCellEditor (Java)

Je voudrais avoir une fenêtre contextuelle JDialog lorsque je modifie un nœud JTree (feuille ou nœud) - par exemple en appuyant sur F2. Cette boîte de dialogue sera ensuite utilisée pour éditer les deux la description et la priorité. Comment éviter que le JTree n'effectue l'édition par défaut du texte comme champ de texte et appelle la boîte de dialogue personnalisée à la place?

Un moyen facile, je suppose, serait de sous-classer la classe DefaultTreeCellEditor et de surcharger la méthode isCellEditable. Ensuite, je voudrais invoquer le JDialog là (je peux obtenir les éléments d'initialisation pertinents lorsque j'instancie le DefaultTreeCellEditor personnalisé) et retourner simplement false pour empêcher l'édition par défaut - mais cela ne me semble pas assez élégant.

Répondre

2

En variante, considérons org.netbeans.swing.outline.Outline, discuté plus en détail here.

+0

J'aime ce que je vois. C'est très similaire à la façon dont GTK + a fait leurs composants TreeView. De cette façon - vous voyez toutes les données pertinentes et pouvez l'éditer. L'affichage de la priorité dans mon problème n'est pas nécessaire, mais ne porte pas atteinte à la solution. Je vais enquêter plus loin, merci. –

2

Je suppose que F2 fonctionne sur vos noeuds d'arbre parce que vous avez appelé JTree#setEditable(true).

La liaison F2 est installée dans BasicTreeUI#installKeyboardActions. Vous pouvez installer votre propre liaison de la manière habituelle:

JTree tree = new JTree(new String[]{"a", "b", "c"}); 
tree.setEditable(true); 
InputMap m = tree.getInputMap(JComponent.WHEN_FOCUSED); 
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 
m.put(ks, "actionMapKey"); 
tree.getActionMap().put("actionMapKey", new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     // do your stuff 
    } 
}); 

JComponent.WHEN_IN_FOCUSED_WINDOW est généralement préférable à JComponent.WHEN_FOCUSED mais BasicTreeUI utilise ce dernier.

Si vous souhaitez utiliser une clé différente, il est un peu difficile à enlever la F2 liant comme il est dans la carte d'entrée parent:

m.remove(ks); 
if(m.getParent() != null) 
    m.getParent().remove(ks); 
Questions connexes