FAQ Java GUIConsultez toutes les FAQ
Nombre d'auteurs : 37, nombre de questions : 155, dernière mise à jour : 10 octobre 2015 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.
- Comment rendre certaines cellules de ma JTable non éditables ?
- Comment faire des colonnes fixes dans une JTable ?
- Pourquoi les en-têtes de ma JTable ne s'affichent-ils pas ?
- Quelle cellule de ma JTable a été cliquée ?
- Comment ancrer les colonnes d'une JTable ?
- Comment sélectionner par programmation des lignes d'une JTable?
- Comment définir l'alignement (gauche, centre, droite, ...) du contenu des colonnes d'une JTable ?
- Qu'est ce qu'un JTree ?
- Comment construire un JTree ?
- Comment afficher la poignée du nœud racine ?
- Comment cacher le nœud racine ?
- Comment modifier les icônes d'un JTree ?
- Comment écouter les événements d'un JTree ?
- Comment modifier la méthode de sélection des nœuds d'un JTree ?
- Comment interdire de dérouler/enrouler un nœud ?
- Comment supprimer/modifier les icônes des noeuds parents ?
- Comment changer l'indentation entre les lignes ?
- Comment ne pas peindre les pointillés au début des lignes quand on utilise le L&F Windows ?
Pour que certaines cellules d'une JTable ne soient pas éditables, il faut créer sa propre classe dérivant de javax.swing.table.DefaultTableModel et redéfinir la méthode isCellEditable(int,int) afin que cette dernière retourne faux pour ces cellules.
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 | public boolean isCellEditable (int row, int column) { if ( celluleEstEditable ) { return ( true ); } else { return ( false ); } } |
On préférera un petit exemple à un long discours ;-)
Code Java : | Sélectionner tout |
1 2 3 4 5 6 | int rows = 10; int cols = 2; JTable table = new JTable(rows, cols); table.getColumnModel().getColumn(0).setPreferredWidth(36); table.getColumnModel().getColumn(1).setPreferredWidth(100); |
Les javax.swing.JTable sont prévus pour être affichés dans un JScrollPane, si ce n'est pas le cas l'en-tête n'est pas affiché. Pour l'afficher, vous pouvez récupérer l'en-tête en utilisant getTableHeader() et l'afficher séparément.
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | int rows = 10; int cols = 5; JTable table = new JTable(rows, cols); JTableHeader header = table.getTableHeader(); JPanel container = new JPanel(new BorderLayout()); container.add(header, BorderLayout.NORTH); container.add(table, BorderLayout.CENTER); |
Il suffit d'utiliser les méthodes columnAtPoint(java.awt.Point) et rowAtPoint(java.awt.Point) en lui passant le paramètre récupéré sur l'évènement java.awt.event.MouseEvent.
Code java : | Sélectionner tout |
1 2 3 4 | int colonne, ligne; Point p = e.getPoint (); colonne = jtable.columnAtPoint (p); ligne = jtable.rowAtPoint (p); |
Il est parfois peu souhaitable que l'utilisateur puisse permuter les colonnes d'une javax.swing.JTable. Contre tout attente, la méthode permettant d'intervenir sur cette propriété n'est pas dans la classe JTable, mais dans la classe javax.swing.table.JTableHeader. Le code suivant permet d'annuler cette fonctionnalité.
Code java : | Sélectionner tout |
maJTable.getTableHeader().setReorderingAllowed(false);
Il faut utiliser le SelectionModel de la JTable pour travailler sur la séléction de la JTable. Par exemple, pour selectionner les lignes 2, 4 et 5 de la JTable myJTable:
Code java : | Sélectionner tout |
1 2 | myJTable.getSelectionModel().addSelectionInterval(2,2); myJTable.getSelectionModel().addSelectionInterval(4,5); |
Pour ce qui est de sélectionner des cellules ou des zones de cellules de la JTable, la méthode changeSelection est plus appropriée :
Code java : | Sélectionner tout |
1 2 3 4 5 | public void changeSelection( int rowIndex, int columnIndex, boolean toggle, boolean extend) |
Il faut utiliser les méthodes setHorizontalAlignment() et setVerticalAlignment() de la classe DefaultTableCellRenderer (ces méthodes sont en fait héritées de la classe JLabel).
Exemple : création d'un DefaultTableCellRenderer qui centre le contenu des colonnes :
Code java : | Sélectionner tout |
1 2 3 4 5 6 | public class CenterTableCellRenderer extends DefaultTableCellRenderer { public CenterTableCellRenderer() { setHorizontalAlignment(CENTER); setVerticalAlignment(CENTER); } } |
Il faut ensuite appliquer le renderer aux colonnes de la JTable :
- Soit à toutes les colonnes de la table :
Code java : | Sélectionner tout |
1 2 3 | JTable table = new JTable(); // on applique le renderer à la table table.setDefaultRenderer(Object.class, new CenterTableCellRenderer()); |
- Soit à une colonne en particulier :
Code java : | Sélectionner tout |
1 2 | // on applique le renderer à la colonne d'indice 0 table.getColumnModel().getColumn(0).setCellRenderer(new CenterTableCellRenderer()); |
On peut aussi faire de même pour les headers, cependant il vaut mieux récupérer le renderer par défaut et le modifier :
- Tous les headers :
Code java : | Sélectionner tout |
1 2 3 | // on applique le renderer sur tous les headers de la table TableCellRenderer headerRenderer = table.getTableHeader().getDefaultRenderer()); ((DefaultTableCellRenderer) headerRenderer).setHorizontalAlignment(DefaultTableCellRenderer.CENTER); |
- Un header en particulier :
Code java : | Sélectionner tout |
1 2 3 | // on applique le renderer sur le header de la colonne d'indice 0 TableCellRenderer headerRenderer = table.getColumnModel().getColumn(0).getHeaderRenderer(); ((DefaultTableCellRenderer) headerRenderer).setHorizontalAlignment(DefaultTableCellRenderer.CENTER); |
Un JTree est un composant Swing permettant d'afficher un arbre (une structure de données hiérarchique). Ce composant ne contient pas de données mais plutôt une vue de données contenues dans son modèle.
Pour construire un JTree, il faut spécifier le modèle de l'arbre dans le constructeur.
Il est possible de créer son propre modèle en implémentant l'interface TreeModel ou bien en utilisant le modèle par défaut DefaultTreeModel.
Code sql : | Sélectionner tout |
DefaultTreeModel myModel = ...;JTree myTree = new JTree(myModel);
Il est possible d'y passer tout objet implémentant l'interface TreeNode. Vous pouvez aussi utiliser la classe par défaut DefaultMutableTreeNode.
Code java : | Sélectionner tout |
1 2 | DefaultMutableTreeNode myRoot = ...; DefaultTreeModel myModel = new DefaultTreeModel(myRoot); |
Voici un exemple simple et complet:
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // Construction du nœud racine. DefaultMutableTreeNode myRoot = new DefaultMutableTreeNode("Manuel"); // Construction des différents nœuds de l'arbre. DefaultMutableTreeNode chap = new DefaultMutableTreeNode("Chapitre1"); myRoot.add(chap); DefaultMutableTreeNode page = new DefaultMutableTreeNode("Page1"); chap.add(page); page = new DefaultMutableTreeNode("Page2"); chap.add(page); chap = new DefaultMutableTreeNode("Chapitre2"); myRoot.add(chap); page = new DefaultMutableTreeNode("Page3"); chap.add(page); // Construction du modèle de l'arbre. DefaultTreeModel myModel = new DefaultTreeModel(myRoot); // Construction de l'arbre. JTree myTree = new JTree(myModel); |
Par défaut, la poignée du nœud racine n'existe pas. Pour l'afficher, il faut ajouter la ligne suivante :
Code java : | Sélectionner tout |
myTree.setShowsRootHandles(true);
Pour cacher le nœud racine, utile lorsque vous souhaitez afficher une forêt (un ensemble d'arbres), utilisez l'instruction suivante:
Code java : | Sélectionner tout |
myTree.setRootVisible(false);
La méthode la plus simple consiste à construire un objet DefaultTreeCellRender puis à modifier les icônes et à l'appliquer à l'arbre.
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | // Construction d'un afficheur par défaut. DefaultTreeCellRenderer myRenderer = new DefaultTreeCellRenderer(); // Changement de l'icône pour les feuilles de l'arbre. myRenderer.setLeafIcon(new ImageIcon("pageIcon.png")); // Changement de l'icône pour les nœuds fermés. myRenderer.setClosedIcon(new ImageIcon("closedBookIcon.png")); // Changement de l'icône pour les nœuds ouverts. myRenderer.setOpenIcon(new ImageIcon("openBookIcon.png")); // Application de l'afficheur à l'arbre. myTree.setCellRenderer(myRenderer); |
De manière générale, le composant JTree ne s'utilise pas tout seul, un autre composant est utilisé pour afficher des informations relatives à l'objet utilisateur. Pour réaliser ce comportement, il est nécessaire de mettre en place un écouteur dit de sélection implémentant l'interface TreeSelectionListener sur l'arbre.
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // Ajoute un événement de sélection à l'arbre. myTree.addTreeSelectionListener(new TreeSelectionListener() { // Appelé lorsque la valeur de la sélection change. public void valueChanged(TreeSelectionEvent event) { // Récupère le chemin dans l'arbre. TreePath myPath = myTree.getSelectionPath(); if(myPath == null) return; // Récupère l'objet utilisateur correspondant. DefaultMutableTreeNode myNode = (DefaultMutableTreeNode) myPath.getLastPathComponent(); Page myPage = (Page) myNode.getUserObject(); myEditorPane().setPage(myPage.getUrl()); } }); |
Il est possible de changer la méthode de sélection des nœuds de l'arbre avec la méthode setSelectionMode. Les différentes valeurs sont : SINGLE_TREE_SELECTION (sélection d'un seul nœud), CONTIGUOUS_TREE_SELECTION (sélection d'un ensemble contigu de nœuds), DISCONTIGUOUS_TREE_SELECTION (sélection d'un ensemble de nœuds). Exemple :
Code java : | Sélectionner tout |
myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
On utilise l'écouteur adapté à cet effet et on renvoie une exception au comportement qu'on ne veut pas produire :
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | jtree.addTreeWillExpandListener(new TreeWillExpandListener(){ @Override public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {} @Override public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException{ // On n'enroule pas le contenu du neoud quand on double-clique dessus throw new ExpandVetoException(event); } }); |
En modifiant l'UI de l'arbre, il est tout à fait possible de modifier les icônes des arbres parents (aussi appelées poignées) :
Code java : | Sélectionner tout |
1 2 | ((BasicTreeUI) ihmArbre.getUI()).setExpandedIcon(null); ((BasicTreeUI) ihmArbre.getUI()).setCollapsedIcon(null); |
Pour modifier l'indentation des éléments, on peut modifier l'UI de l'arbre :
Code java : | Sélectionner tout |
1 2 | ((BasicTreeUI) jTree.getUI()).setRightChildIndent(0); ((BasicTreeUI) jTree.getUI()).setLeftChildIndent(0); |
Il faut créer un nouveau BasicTreeUI et redéfinir les méthodes paintHorizontalPartOfLeg() et paintVerticalPartOfLeg pour indiquer qu'elles ne font rien :
Code java : | Sélectionner tout |
1 2 3 4 5 | jTree.setUI(new BasicTreeUI(){ protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds, Insets insets, Rectangle bounds, TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) { } protected void paintVerticalPartOfLeg(Graphics g, Rectangle clipBounds, Insets insets, TreePath path) { } }); |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.