Je voudrais ajouter un bouton supplémentaire avec une petite icône à droite d'un article dans un JTree. cela peut-il être fait? si c'est le cas, comment?java swing: ajouter un bouton graphique personnalisé à JTree item
merci!
Je voudrais ajouter un bouton supplémentaire avec une petite icône à droite d'un article dans un JTree. cela peut-il être fait? si c'est le cas, comment?java swing: ajouter un bouton graphique personnalisé à JTree item
merci!
Vous devez personnaliser CustomCellRenderer qui implémente TreeCellRenderer et l'attacher à JTree.
Dans votre CustomCellRenderer, vous pouvez mettre un bouton et une icône.
JTree tree = new JTree(rootVector);
TreeCellRenderer renderer = new CustomCellRenderer();
tree.setCellRenderer(renderer);
Vérifiez cet exemple: (référencé ci-dessus le code d'ici)
http://www.java2s.com/Code/Java/Swing-JFC/TreeCellRenderer.htm
Vous pouvez ajouter un TreeCellRenderer à votre JTree. Ce Renderer peut afficher une icône sur chaque élément de l'arbre.
De l'Javadoc DTree:
Pour utiliser DTree pour afficher des noeuds composés (par exemple, les noeuds contenant à la fois une icône graphique et texte), la sous-classe
javax.swing.tree.TreeCellRenderer
et utilisersetCellRenderer
pour dire l'arbre pour l'utiliser.
Un nœud composé est ce que vous voulez. Vous devez mettre en œuvre sur une seule méthode qui renverra un objet Composite
qui est, dans votre cas, un petit panneau contenant un bouton et une étiquette côte à côte.
Clamp,
Avez-vous eu du succès avec cela? Je voulais faire la même chose et j'avais du mal à faire en sorte que JButton réponde à l'utilisateur. Configurer le moteur de rendu pour obtenir le bouton à afficher s'est déroulé sans problème, mais tous les événements de souris ont été gérés par le JTree lui-même et non transmis à mon bouton.
J'ai finalement trouvé une solution et pensé que je posterais ici pour d'autres de commenter (peut-être il y a une meilleure façon?)
En plus de mon moteur de rendu personnalisé, j'ai aussi créé un éditeur personnalisé qui étend DefaultTreeCellEditor . Mon moteur de rendu personnalisé est transmis dans l'éditeur personnalisé via le constructeur. Dans l'éditeur, je remplace isCellEditable pour renvoyer true et je substitue getTreeCellEditorComponent pour retourner renderer.getTreeCellRendererComponent. C'était la clé. Il renvoie le composant de rendu, donc tous les clics sont passés à mon panneau dans mon moteur de rendu personnalisé et mon JButton répondait alors normalement aux événements d'action.
Voici mon éditeur:
public class MyTreeCellEditor extends DefaultTreeCellEditor {
public MyTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
super(tree, renderer);
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row) {
return renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf, row, true);
}
public boolean isCellEditable(EventObject anEvent) {
return true; // Or make this conditional depending on the node
}
}
Sur votre arbre, assurez-vous de définir votre éditeur personnalisé:
myTree.setCellEditor(new MyTreeCellEditor(myTree, (DefaultTreeCellRenderer) myTree.getCellRenderer()));
+1. 1,5 ans plus tard et cela a beaucoup aidé. Merci. – sqram
+1. J'ai seulement utilisé l'interface TreeCellEditor, car DefaultTreeCellEditor a beaucoup de fonctionnalités inutiles. – Nulano