Descriptif 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 
41 42 43 44 45 

Swing - Interface Homme-Machine

5.8.JTable

JTable est un composant extrêmement utile mais malheureusement assez complexe. En effet un package complet, nommé javax.swing.table lui est consacré.
Le composant JTable permet d’afficher des tables de données, en permettant éventuellement l’édition de ces données. Un JTable ne contient pas ses données mais les obtient à partir d’un tableau d’objets à 2 dimensions, ou à partir d’un modèle de données.
Nous étudierons ici assez brièvement ce package, mais il ne faut pas oublier que ce dernier intègre diverses fonctionnalités que nous n’étudierons pas ici telles que l’impression et l’affichage avant impression, les interactions client-serveur à l’aide de CORBA…

Exemple de JTable :


La classe JTable implémente l’interface Scrollable (ce qui signifie qu’il peut être placé dans un JScrollPane) .

Chaque JTable dispose de trois modèles qui sont :
  • TableModel
  • TableColumnModel
  • ListSelectionModel.

TableModel définit la manière dont sont stockées les données, et gèrées les ajouts et suppressions ainsi que la récupération des données. Il définit aussi les types de données de chaque colonne, et spécifie aussi si une cellule est éditable. Toutes les données de la table sont stockées dans le TableModel (tableau à 2 dimension ou vecteur de vecteurs).

TableColumnModel gère des instances de TableColumn (c'est-à-dire une colonne de la table). TableColumnModel est responsable de l’affichage des colonnes dans la table. Chaque TableColumn possède un cell renderer, un cell editor, un table header, et un cell renderer pour le table header.

ListSelectionModel définit le mode de sélection (single-interval, multiple-interval). ListSelectionModel est très flexible et permet de personnaliser les sélections de toutes les manières que l’on souhaite.

5.8.1.Utilisation simple d’une JTable

La méthode la plus simple pour construire une table est de passer un vecteur de vecteurs en paramètres du constructeur.

Le constructeur suivant va être utilisé :
  • JTable (Vector rowData, Vector columnNames)

Ce constructeur reçoit des vecteurs de vecteurs (rowData pour les lignes, columnNames pour les entêtes).

Pour pouvoir ensuite afficher la table il est préférable d’utiliser l’interface Scrollable implémentée par JTable.

JScrollPane sp = new JScrollPane(table);

5.8.2.Renderers par défaut

Nous allons nous intéresser ici à un mécanisme particulièrement utile qui est celui de l’utilisation des renderers. En l’occurrence il va s’agir ici de DefaultTableCellRenderer.

Le principe est de s’appuyer sur les renderers par défaut. Pour cela la JTable doit connaître le type de données à afficher, il va s’adresser à l’objet qui encapsule les données, c'est-à-dire le TableModel.

Il y a alors deux cas possible :

  • Il n’existe pas de TableModel crée par l’utilisateur. JTable utilise le TableModel crée par défaut.

Demande au modèle quel est le type des objets contenus dans la colonne i : Modele.getColumnClass(i)

L’implémentation par défaut renvoie toujours la classe Object
  • Si il existe un TableModel personnalisé, alors la JTable s’adresse à ce dernier.
Demande au modèle quel est le type des objets contenus dans la colonne i : Modele.getColumnClass(i)

La fonction getColumnClass redéfinie renvoie le type exact de la donnée à afficher.

Une fois que JTable connaît le type de données à afficher, il se réfère à son dictionnaire liant les types et leurs renderers associés.

Ce dictionnaire est la classe suivante :
protected Hashtable defaultRenderersByColumnClass

Ce dictionnaire contient par défaut la liste suivante :
  • Boolean (JCheckbox)
  • Number (JLabel aligné à droite)
  • Date (JLabel formaté avec DateFormat et aligné à droite)
  • ImageIcon (JLabel aligné au centre)
  • Object (JLabel aligné à gauche affichant une chaîne de caractères)

Il va donc s’agir de redéfinir un TableModel pour notre JTable et de lui inclure la méthode qui renvoie le type d’objet :

public class getColumnClass(int colonne) {
return getValueAt(0, colonne).getClass();
}

5.8.3.Les Editors

Comme on a pu le constater, par défaut les cellules d’une JTable sont éditables. Par contre, lorsque l’on utilise un renderer personnalisé, on peut choisir de rendre le tableau non éditable.

Il est souvent possible que l’on cherche à mettre en place une manière précise d’éditer une cellule, par exemple de faire apparaître une JList où l’on doit sélectionner une valeur.

5.8.4.Fonctionnement des Editors

Le fonctionnement des editors est très similaire à celui des renderers. Lorsque l’utilisateur cherche à modifier le contenu d’une cellule (double clic, saisie clavier), l’editor prend le contrôle sur la cellule.

Voici le fonctionnement des Editors :

Demande à l’editor comment gérer la cellule (i,j) que l’utilisateur souhaite éditer
Renvoie le composant graphique entièrement paramétré

Comme dans le cas des renderers, on est assez libre dans l’implémentation. On peut choisir d’hériter d’un composant graphique (extends JLabel ….), ou bien d’encapsuler ce composant dans une variable d’instance.

Il est toutefois indispensable d’implémenter l’interface en question (ici CellEditor).

La figure ci-dessous présente la hiérarchie des classes editor.



On peut remarquer qu’il n’existe pas de classe de type ListCellEditor (ce qui est logique car JList n’est pas un composant éditable).

La classe DefaultCellEditor peut être utilisée pour les tables et pour les arbres car elle hérite des deux interfaces TableCellEditor et TreeCellEditor.

Il existe néanmoins une classe plus adaptée à l’édition d’un arbre, qui est DefaultTreeCellEditor.

5.8.5.Créer notre Editor

Pour illustrer l’implémentation d’un editor appliqué à notre exemple précédent, on considère que l’utilisateur doit choisir une ville dans une liste déroulante. Une manière simple de créer un editor est d’utiliser la classe DefaultCellEditor.
Celle-ci encapsule le composant graphique sous la forme d’une variable nommée editorComponent. Il est possible d’afficher un JTextField, une JCheckBox ou encore une JComboBox. DefaultCellEditor dispose de constructeurs permettant d’accepter chacun des composants précités.

Object[] villes = {"Paris", "Venise", "Mexico", "Toulouse", "Bordeaux"};

JComboBox cboVilles = new JComboBox(villes);
DefaultCellEditor monEditor = new DefaultCellEditor(cboVilles);

TableColumn col3 = table.getColumnModel().getColumn(3);
col3.setCellEditor(monEditor);
Une autre manière de créer un editor personnalisé consiste à hériter de AbstractCellEditor, et d’implémenter les fonctions getTableCellEditorComponent() et getCellEditorValue().
En voici un exemple :
class EditorPerso extends AbstractCellEditor implements TableCellEditor {

public JTextField monChamp;

public EditorPerso() {
monChamp = new JTextField();
monChamp.setBackground(Color.GREEN);
}

public Component getTableCellEditorComponent (JTable table, Object value,
boolean isSelected, int row, int column) {
monChamp.setText((String) value);
return monChamp;
}

public Object getCellEditorValue() {
String a = monChamp.getText();
return a;
}
}

Descriptif 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 
41 42 43 44 45 

Retrouvez ci-dessous les autres sections du Laboratoire Sun
Exemples de code
JavaManipuler les looks and feel (lister et affecter)10/15/07
JavaFaire sa propre injection de dépendance avec les annotations5/9/06
JavaSplash screen avec progress Bar5/5/06
JavaFaire un splash screen en swing5/5/06

Essentiels de cours Java
JavaEJB 3 - Les Entreprise Java Bean version 3 (JavaBeans)
Cet essentiel est la suite de « Entreprise JavaBean 2.1 ». Cependant, nous allons étudier les nouvelles spécifications 3.0 qui simplifient énormément le développement par rapport aux EJB 2.6/20/06
JavaSWT - Créer des interfaces graphiques performantes
SWT (Standard Widget Toolkit) est une librairie graphique qui vous permet de réaliser des applications graphiques Java beaucoup plus avancées et surtout plus rapide à l’exécution.1/29/06
JavaStruts - Un framework MVC pour vos applications J2EE
Struts est un framework open-source qui vous permet de gagner du temps, mais qui permet aussi de voir des applications complexes comme une suite de composants de base : Vues, Actions, Modèles. Vous gagnez ainsi en évolutivité et en lisibilité du code.1/13/06
JavaHibernate - Persistance objet - relationnel
Cet essentiel explique comment utiliser Hibernate afin de gérer la persistance objet relationnel au sein de vos applications Java.12/14/05
JavaIntroduction J2EE - Applications d'entreprise
Cours d'introduction aux diverses technologies et outils que l'on peut rencontrer dans le monde du Java orienté entreprise J2EE12/14/05
JavaEJB 2 - Les Entreprise Java Bean (JavaBeans)
L'objectif avec EJB2 (Entreprise JavaBeans) est d'introduire les concepts de l’Ingénierie Logicielle Basée sur les Composants.12/14/05
JavaDesign Pattern - Améliorez l'architecture de vos programmes
Afin de répondre a des situation récurrentes en programmation, les "design pattern" apportent une solution type à beaucoup de contraintes liées à la programmation objet.12/14/05
JavaArchitecture J2EE - Comment organiser son application J2EE
Ce cours explique comment créer un code modulable, lisible et évolutif afin d'assurer la pérénité de son application.12/14/05
JavaLes web-services - Publication de services
Le développement tend vers les technologies du Web. Il est difficile de faire la distinction entre les différents logiciels qui sont de plus en plus intégrés au Web. Les Web Services rentrent dans l’optique de différencier bien précisément les couches.12/14/05
JavaAnt - L'automatisation des tâches du programmeur
Ecrire des scripts afin d'exécuter les tâches récurrentes10/31/05
JavaIntroduction au langage Java - Présentation & historique
Présentation des origines du langage, ainsi que se buts premiers8/11/05
JavaLa Syntaxe Java - Bases & nomenclatures
Bases de la syntaxe du langage Java8/11/05
JavaLes Classes - Concepts & héritage
Base du développement objet en Java grâce aux classes8/11/05
JavaLes Exceptions - Gestion d'erreurs
Gérer les erreurs liés à la programmation8/11/05

Articles
Eclipse Europa : le successeur de Callisto
Après Eclipse Callisto (Eclipse 3.2), la fondation Eclipse sort la nouvelle mouture d'Eclipse appelée Europa (Eclipse 3.3) faisant ainsi passer le nombre de projets embarqués de 10 à 21. Que ceux qui sont réticents aux « distributions » d'Eclipse se rassu12/21/07
JavaCruiseControl : l’outil d’intégration continue à avoir dans sa boite à outils
CruiseControl est un projet open-source offrant de multiples fonctionnalités pour l’intégration, que ce soit pour des développements Java ou .Net. Il est courant sur un projet d’être plusieurs développeurs avec des tâches de développement réparties. Dans7/2/07
JavaEJB3 - Des concepts à l'écriture du code - Editions DUNOD
Consulter le résumé du premier ouvrage du laboratoire Sun de SUPINFO : EJB3 - Des concepts à l'écriture du code. Guide du développeur, éditions DUNOD.5/27/07
JavaPassage de certification Java Web (SCWCD)
Passer une certification est toujours un moment important car cela permet de mieux faire reconnaître ses compétences face à un recruteur ou un employeur.5/12/07
JavaGoogle Web Toolkit
Google Web Toolkit est un framework java pour générer du javascript et des requêtes Ajax à partir d’un code java. Voilà comment il fonctionne.5/10/07
JavaJ2ME Vs SDE
Demain, les terminaux « légers » seront plus nombreux que les ordinateurs personnels, ce qui entraîne une bataille sur le choix d’une plateforme identique à tous ces terminaux… Aujourd’hui nous retrouvons le J2ME ainsi que le SDE qui s’offrent une rude b4/22/07

Tips du laboratoire
EclipseVisual Editor avec Eclipse Europa, c'est possible3/28/08
EclipseGérer les projets dans un workspace.10/16/07
JavaManager votre server d'application avec Eclipse4/21/07
JavaVue des sub-packages avec Eclipse4/21/07
JavaGlisser-déposer avec Eclipse4/21/07

Laboratoire SUPINFO des technologies Sun
labo-sun@supinfo.com


Conditions d'utilisation et © Copyright SUPINFO International University
23, rue de Château Landon - 75010 PARIS - Tél : +33 (0) 153359700 Fax : +33 (0) 153359701
Respect de la vie privée