2 votes

Comment modifier le comportement d'édition par défaut d'un TreeCellEditor (Java)

J'ai un objet personnalisé qui a une description (String) et une valeur de priorité (int). J'affiche ces valeurs dans un arbre JT car il existe une relation hiérarchique entre les différents objets de ce type. Je n'affiche que la description dans les nœuds de l'arbre car la priorité n'est pas importante pour l'affichage.

J'aimerais qu'une fenêtre JDialog s'ouvre lorsque je modifie un nœud de JTree (feuille ou nœud) - par exemple en appuyant sur F2. Cette boîte de dialogue sera ensuite utilisée pour éditer à la fois la description et la priorité.

Comment empêcher le JTree d'effectuer l'édition par défaut du texte en tant que champ de texte et d'appeler la boîte de dialogue personnalisée à la place ?

Une solution simple consisterait à sous-classer la classe DefaultTreeCellEditor et à surcharger la méthode isCellEditable. J'invoquerais alors le JDialog (je peux obtenir les éléments d'initialisation pertinents lorsque j'instancie le DefaultTreeCellEditor personnalisé) et renverrais simplement false pour empêcher l'édition par défaut - mais cela ne me semble pas assez élégant.

2voto

trashgod Points 136305

En guise d'alternative, envisagez org.netbeans.swing.outline.Outline , discuté plus en détail ici .

2voto

Geoffrey Zheng Points 3503

Je suppose que F2 fonctionne sur les nœuds de votre arbre parce que vous avez appelé JTree#setEditable(true) .

La liaison F2 est installée dans BasicTreeUI#installKeyboardActions . Vous pouvez installer votre propre fixation 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 cette dernière.

Si vous souhaitez utiliser une autre touche, il est un peu difficile de supprimer la liaison F2 car elle se trouve dans la carte d'entrée parentale :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X