Newsletter Developpez.com

Inscrivez-vous gratuitement au Club pour recevoir
la newsletter hebdomadaire des développeurs et IT pro

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.


SommaireAWT et SwingTableaux et arbres (JTable et JTree) (18)
précédent sommaire suivant
 

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 ); 
        }  
}

Mis à jour le 16 mai 2002 Johann.Heymes

On préférera un petit exemple à un long discours ;-)

Mis à jour le 5 juin 2002 Johann.Heymes

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.

Un exemple est disponible ci-dessous.

Mis à jour le 27 janvier 2003 Johann.Heymes

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);

Mis à jour le 27 janvier 2003 Johann.Heymes

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);

Mis à jour le 1er mars 2003 Clement Cunin

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)

Mis à jour le 25 mai 2007 JMLLB

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);

Mis à jour le 26 mai 2007 le y@m's

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.

Mis à jour le 16 décembre 2006 lakestionkitue

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);
Pour construire un modèle d'arbre par défaut, il est nécessaire de passer le nœud racine (root).
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);
Pour créer un nœud, il faut indiquer un objet utilisateur. L'arbre utilisera le résultat de la méthode toString pour afficher une représentation de l'objet à un nœud donné. Pour un arbre représentant un système de fichiers, des objets File pourront être utilisés.

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);

Mis à jour le 16 décembre 2006 lakestionkitue

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);

Mis à jour le 16 décembre 2006 lakestionkitue

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);

Mis à jour le 16 décembre 2006 lakestionkitue

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);
Deux autres solutions consistent à implémenter l'interface TreeCellRenderer ou bien à étendre la classe DefaultTreeCellRenderer, permettant ainsi de modifier les icônes, la police et la couleur de fond des différents nœuds de l'arbre.

Mis à jour le 16 décembre 2006 lakestionkitue

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()); 
   } 
});
La méthode valueChanged de l'interface TreeSelectionListener est appelée lorsque l'utilisateur sélectionne ou désélectionne un des nœuds de l'arbre.

Mis à jour le 16 décembre 2006 lakestionkitue

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);

Mis à jour le 16 décembre 2006 lakestionkitue

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); 
	} 
});
Ici, on interdit donc d'enrouler des nœuds.

Mis à jour le 21 décembre 2009 if_zen

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);
Ici, on les a supprimées, mais vous pouvez tout à fait les modifier.

Mis à jour le 21 décembre 2009 Baptiste Wicht if_zen

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);
Ici, on place les enfants au même niveau que les parents.

Mis à jour le 21 décembre 2009 if_zen

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)  { } 
});

Mis à jour le 21 décembre 2009 if_zen

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2016 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.

 
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -