Java : Graphique Swing juin 2006 Brigitte Groléas.

Slides:



Advertisements
Présentations similaires
[number 1-100].
Advertisements

Réaliser en Java un programme client d’une Base de Données
Conception d’IHM en Java
Conception d’IHM en Java
1 Swing par la pratique contrat Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique.
Mon carnet De comportement
X.Blanc & J.Daniel Swing et Applet X.Blanc & J.Daniel
Classe : …………… Nom : …………………………………… Date : ………………..
Audrey Occello Cédric Joffroy Anne-Marie Dery
Les numéros
Les Prepositions.
Gestionnaires de géométrie
Arbres Un premier exemple Contenu Rendu Ecouteurs Parcours
Composants de Swing JavaBeans Actions Boutons Icônes Bordures Curseurs
Composants graphiques de Java
Page 1 Les applets Jacques Lonchamp. Page 2 Présentation Une applet est téléchargée à partir dune machine distante qui fournit le code. Ce chargement.
Présentation de l’application « Livret personnel de compétences »
Voisin-Polian : Introduction à Java 1 Introduction à Java - AWT - Frédéric VOISIN – Nicole POLIAN FIIFO - « Remise à Niveau »
Les Interfaces graphiques Les Swing. Les interfaces graphiques: Introduction Une application est une boîte noire. Prend des entrées et produit des sorties.
Les composants Graphiques Atomiques
Lexique des manœuvres de base pour utiliser à PowerPoint
La diapo suivante pour faire des algorithmes (colorier les ampoules …à varier pour éviter le « copiage ») et dénombrer (Entoure dans la bande numérique.
Vos premiers pas en Swing
Retour sur MVC. Introduction aux IHM et à la réflexivité Java Vos premiers pas en Swing.
Vos premiers pas en Swing
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV JFC/Swing Module Java Expert.
Swing et les Interfaces Graphiques
Gestion Informatisée du Brevet Informatique & Internet
Les requêtes La Requête est une méthode pour afficher les enregistrements qui répondent à des conditions spécifiques. La requête est donc un filtre.
Page 1 Introduction à ATEasy 3.0 Page 2 Quest ce quATEasy 3.0? n Ensemble de développement très simple demploi n Conçu pour développer des bancs de test.
Formation au module Structure de ZENTO
Les verbes auxiliaires Avoir ou être ?? Choisissez! Cest un verbe Dr Mrs Vandertrampp? Cest un verbe réfléchi?
Écouteurs de click d'une fenêtre
1 Guide de lenseignant-concepteur Vincent Riff 27 mai 2003.
MICROSOFT POWER POINT Fais « Enter » Par Danièle Lippé.
Interface graphiques.
Graphical User Interface (GUI)
La Saint-Valentin Par Matt Maxwell.
2 TP avec l ’aide d ’un modeleur 3D :
1. 2 PLAN DE LA PRÉSENTATION - SECTION 1 : Code HTML - SECTION 2.1. : CSS (Méthode 1) - SECTION 2.2. : CSS (Méthode 2) - SECTION 3 : JavaScript - SECTION.
Notre calendrier français MARS 2014
Multi-Thread Jian-Yun Nie
Badr Benmammar Formation Développeur Java Thread et Swing Badr Benmammar
Formation Développeur Java Applet et interfaces graphiques avec AWT
Java Swing.
COURS DE PROGRAMMATION ORIENTEE OBJET :
C'est pour bientôt.....
Veuillez trouver ci-joint
TYPES DE COMPOSANTES SWING Cours 420-B43. On peut distinguer 3 Niveaux 3 niveaux Haut niveau : toute application graphique doit comprendre au moins une.
Les Nombres! de 0 à 20.
LUNDI – MARDI – MERCREDI – JEUDI – VENDREDI – SAMEDI – DIMANCHE
Traitement de différentes préoccupations Le 28 octobre et 4 novembre 2010.
ECOLE DES HAUTES ETUDES COMMERCIALES MARKETING FONDAMENTAL
Biologie – Biochimie - Chimie
Création et présentation d’un tableau avec Word 2007
10 paires -. 9 séries de 3 étuis ( n° 1 à 27 ) 9 positions à jouer 5 tables Réalisé par M..Chardon.
CALENDRIER-PLAYBOY 2020.
USAM BRIDGE H O W E L L -CLASSIQUE
9 paires séries de 3 étuis ( n° 1 à 27 )
Les Chiffres Prêts?
Médiathèque de Chauffailles du 3 au 28 mars 2009.
Cours 91 9 Interfaces graphiques avec awt. Cours 92 Plan Introduction : deux bibliothèques graphiques 1.Comment se dessine une fenêtre ?  Un exemple.
Interfaces graphiques. Composants d'interface utilisateur graphique (GUI) 1 Bibliothèques Awt et Swing Procédures communes pour l'utilisation de ces clases.
Interface graphique PO2 ( ) Chapitre 3 Gestionnaires géométrie.
Construire une interface graphique en Java
 1) Il faut connaître le modèle et son fonctionnement  2) Définir le contrôle que l’on veut faire ouvrir, fermer, afficher, etc.) sur le modèle  3)
Transcription de la présentation:

Java : Graphique Swing juin 2006 Brigitte Groléas

Les API swing awt ancien leger base des applets import java.awt.*; awt ancien leger base des applets AWT (Abstract Window Toolkit, JDK 1.1) swing beaucoup plus complet Swing (JDK/SDK 1.2) construit sur AWT import javax.swing.*; juin 2006 Brigitte Groléas

Les principes Container - contient des widgets ou des containers Windows, JFrame, JPanel ... Disposeur ( Layout ) Comment disposer les widgets à l'intérieur du contener un disposeur par container Widget éléments graphiques à poser dans le container juin 2006 Brigitte Groléas

Canevas class Ihm extends JFrame { public Ihm() { } super( "suis un essai"); FlowLayout dispo = new FlowLayout (); fenetre.setLayout( dispo ); JLabel l = new JLabel( "titi"); fenetre.add(l); JTextField t = new JTextField(20); fenetre.add(t); fenetre.pack(); fenetre.setVisible(true); } juin 2006 Brigitte Groléas

Hiérarchie des classes juin 2006 Brigitte Groléas

JScrollPane scrollPane = new JScrollPane(textArea); Les Conteneurs (1) JFrame : remplace la Frame (BorderLayout disposeur par défaut) JPanel : classe destinée à contenir d'autres classes JScrollPane : Permet de visualiser un objet trop grand. Au lieu d'écrire directement dans un JPanel  JScrollPane scrollPane = new JScrollPane(textArea); juin 2006 Brigitte Groléas

Les Conteneurs(2) JTabbedPane : Mettre plusieurs JPanel dans des onglets JSplitPane : Permet d'affichier deux JPanels séparés verticalement ou horizontalement JTabbedPane tabbedPane = new JTabbedPane(); ImageIcon icon =new ImageIcon("onglet/connexion.png"); JPanel panelOnglet1 = new JPanel (); tabbedPane.addTab("Client", icon, panelOnglet1, "Does nothing"); JSplitPane pp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panel1, panel2); juin 2006 Brigitte Groléas

Component : propriétés et fonctions couleur de fond : void setBackground(color)/ color getBackground couleur : void setForeground(color)/ color getForeground curseur : void setCursor (Cursor)/ Cursor getCursor() police : void setFont(Font) / Font getFont () localisation nom ..... ..... Taille Visibilité : void setVisible() juin 2006 Brigitte Groléas

interface pour positionner les objets à l’intérieur d’un container Disposer les objets Layout Manager : interface pour positionner les objets à l’intérieur d’un container Tout container doit avoir un disposeur Java pose un disposeur par défaut sur chaque contenair juin 2006 Brigitte Groléas

Les conteneurs 1 FlowLayout f = new FlowLayout (); fen.setLayout(f); trois un deux quatre cinq FlowLayout f = new FlowLayout (); fen.setLayout(f); NORTH SOUTH WEST EAST CENTER BorderLayout b = new BorderLayout(); fen.setLayout(b); JButton BB = new JButton(« ok »); fen.add(truc, BorderLayout.NORTH); ... juin 2006 Brigitte Groléas

Les conteneurs 2 Gridlayout g new GridLayout(3,2); fen.setLayout(g); un deux quatre cinq trois six Gridlayout g new GridLayout(3,2); fen.setLayout(g); ... JPanel cardPanel = new JPanel(), ... , LargePanel = new Panel(); CardLayout card = new CardLayout(); cardPanel.setLayout(card); ... LargePanel.setLayout (new BorderLayout()); lrg = new ... LargePanel.add (lrg,BorderLayout.CENTER); cardPanel.add("lrg", LargePanel); juin 2006 Brigitte Groléas

Des conteneurs dans des conteneurs JFrame f = new JFrame(); JPanel p = new JPanel(); p.add(new JLabel("Nom :"); p.add( new JTextField(20); f.add(p); nom : juin 2006 Brigitte Groléas

à vous ... coucou 1 Coucou 2 coucou5 coucou 7 juin 2006 Brigitte Groléas

Boite de dialiogue JOptionPane.showMessageDialog(null, "Bonjour, monde"); JLabel component = new JLabel( "Erreur de saisie !" ); JOptionPane.showMessageDialog( null , // frame parent component , // objet graphique a afficher "Message d'erreur" , // barre de titre JOptionPane.ERROR_MESSAGE ); juin 2006 Brigitte Groléas

Saisie dans une boite de dialogue import javax.swing.JOptionPane; String rep; rep= JOptionPane.showInputDialog(null, "nom ?"); System.out.println( rep); Dans le corps de la classe juin 2006 Brigitte Groléas

Quelques widgets JLabel JTextField JComboBox JButton JList JCheckBox juin 2006 Brigitte Groléas

JLabel et JButton JButton( String ) ou JButton(Icon ) getLabel() JLabel(String, int) où int = JLabel.LEFT, JLabel.RIGHT, JLabel.CENTER getText() setText() getAlignement() setHorizontalAlignment(JLabel.LEFT) Un Label a un fond transparent par défaut setOpaque(true) pour rendre sensible à la couleur de fond JLabel l = new JLabel("nom : ", JLabel.LEFT); JButton( String ) ou JButton(Icon ) getLabel() setLabel( String ) isEnabled() setEnabled(false) JButton bOk = new JButton("Valider"); juin 2006 Brigitte Groléas

JLabel avec image Mélanger un texte et une icône sur un label Permet la superposition ImageIcon i = new ImageIcon("nomPackage/Pig.gif"); JLabel spiderPig = new JLabel( "Tiens, un cochon !" , i , JLabel.CENTER ); juin 2006 Brigitte Groléas

Zone de saisie JTextField() , JTextField( String, int) setEchoChar( char ) pour une saisie aveugle setText( String ) setEditable(boolean) getText() JTextField t = new JTextField("Nom ? ", 20); JTextArea(),JTextArea( nbLig, nbCol ),JTextArea( String ) getColumns(), getRows() insert(String, int ) où int est la position du texte inséré append(String) JTextArea t = new JTextArea(); juin 2006 Brigitte Groléas

Case à cocher JCheckBox c1 = new JCheckBox("homme" , true); sans lien JCheckBox c1 = new JCheckBox("homme" , true); JCheckBox c2 = new JCheckBox("femme" , false); JCheckBox c3 = new JCheckBox("enfant" , false); .setSelectedIcon(NomIcone) .setIcon(NomIcone) isSelected() : retourne true si la Checkbox est sélectionnée setSelected(true) : pour que la case soit cochée juin 2006 Brigitte Groléas

Exclusion mutuelle ButtonGroup identite = new ButtonGroup(); JRadioButton homme = new JRadioButton( "Homme" ); homme.setSelected( true ); JRadioButton femme = new JRadioButton( "Femme" ); identite.add( homme ); identite.add( femme ); Le ButtonGroup n'est pas une widget, ni un contener, il ne s'ajoute pas au contener. Pas de add juin 2006 Brigitte Groléas

Liste JComboBox Jlist Liste non déroulante Liste déroulante avec sélection multiple possible String[] items = {"item1", "item2"}; JComboBox aa = new JComboBox(items); String[] items = {"A", "B", "C", "D"}; JList list = new JList(items); Object[] items2 = {new Integer(123), new java.util.Date()}; list = new JList(items2); juin 2006 Brigitte Groléas

getSelectedIndex(), retourne l’index de ll’item sélectionné Méthodes des listes addItem(Object) setEditable(true) setSelectedItem(« Paris ») setMaximumRowCount(5) getSelectedIndex(), retourne l’index de ll’item sélectionné juin 2006 Brigitte Groléas

À vous … Dessinez cet écran juin 2006 Brigitte Groléas

Misc ... JSlider : valeur numérique comprise entre 2 bornes. JProgressBar : barre de progression JToolTip : Bulle d'aide JLabel l = new Jlabel("nom"); l.setToolTipText("Entrez un patronyme"); JSlider slider = new JSlider(minimum, maximum, initValue); slider.setMajorTickSpacing(100); slider.setMinorTickSpacing(10); slider. setPaintTicks(true); slider.setPaintLabels(true); juin 2006 Brigitte Groléas

JMenu JMenu un = new JMenu("Un"); JMenuItem unSousUn = new JMenuItem("UnsousUn"); un.add(unSousUn); JMenuItem deuxSousUn = new JMenuItem("DeuxSousUn"); un.add(deuxSousUn); JMenuItem troisSousUn = new JMenuItem("TroisSousUn"); un.add(troisSousUn); JMenu deux = new JMenu("Deux"); JMenuItem unSousDeux = new JMenuItem("unSousDeux"); deux.add(unSousDeux); JMenuBar mb = new JMenuBar(); mb.add(un); mb.add(deux); setJMenuBar(mb); juin 2006 Brigitte Groléas

JMenu JMenu un = new JMenu("Un"); JMenuItem unSousUn = new JMenuItem("UnsousUn"); un.add(unSousUn); JMenu deux = new JMenu("Deux"); JMenuItem unSousDeux = new JMenuItem("unSousDeux"); deux.add(unSousDeux); JMenuItem deuxSousDeux = new JMenuItem("DeuxSousDeux"); deux.add(deuxSousDeux); un.add(deux); JMenuItem troisSousUn = new JMenuItem("TroisSousUn"); un.add(troisSousUn); JMenuBar mb = new JMenuBar(); mb.add(un); setJMenuBar(mb); juin 2006 Brigitte Groléas

À vous … Créer le menu Awt swing bouton Jbouton liste Jlist unique ComboBox sélections multiples case à cocher exclusion juin 2006 Brigitte Groléas

Les fontes Font maFont = new Font (« serif », Font.BOLD | Font.ITALIC, 32); xxx.setFont( maFont ) Icon monIcone = new ImageIcon(«chat.gif ») Xxx.setIcon( monIcone) juin 2006 Brigitte Groléas

Color coul = new Color(int rouge, int vert, int bleu ); Les couleurs 13 constantes prédéfinies (Color.RED, Color.Blue ...) Couleurs personnalisées Color coul = new Color(int rouge, int vert, int bleu ); 0 <= r,v,b <= 255 Méthodes associées setForeground( Color ) setBackGround( Color ); La classe java.awt.SystemColor permet de récupérer les couleurs de l ’environnement « bureau » via les constantes : juin 2006 Brigitte Groléas

JColorChooser Dialogue permettant de choisir une couleur Color c = JColorChooser.showDialog((JFrame) fenetre, "Choix de la couleur de fond", couleur); juin 2006 Brigitte Groléas

L'événementiel Boucle d'attente d'événements système asynchrones. Le gestionnaire d'événements appelle les méthodes appropriées appartenant aux objets ayant déclaré répondre à ces événements. En programmation événementielle, les méthodes de réponses aux événements systèmes sont appelées routines de callback. juin 2006 Brigitte Groléas

Modèle de délégation Dans le modèle de programmation événementielle en Java on favorise la délégation : On crée des liens entre -   des contrôles qui gèrent des événements et -   des méthodes personnelles (des écouteurs) qui répondent de façon appropriée aux contrôleurs qui ont besoin de leurs services. La délégation n'est pas la seule façon de faire de la programmation événementielle. Elle permet cependant un partage des rôles clair entre producteurs d'événements (les contrôles) et consommateurs d'événements (les écouteurs). juin 2006 Brigitte Groléas

Ecouter Poser un objet Listener sur l'objet que l'on veut rendre réactif Un Listener doit implémenter une interface XXListener où XX est le nom de l'événement Exemple : ActionListener, WindowListener, MouseListener juin 2006 Brigitte Groléas

Les interfaces disponibles ActionListener click sur bouton ... AdjustmentListener changement d’un curseur ... FocusListener focalisation ItemListener case à cocher, liste ... KeyListener touche clavier MouseListener click souris ... MouseMotionListener déplacement souris ... WindowListener actions fenêtre ... ComponentListener masquer un composant ... ContainerListener ajouter un composant ... TextListener modif de texte ... juin 2006 Brigitte Groléas

Les écouteurs d'événements public class Essai extends JPanel{ public Essai() { JButton button = new JButton("Clic ici"); button.addActionListener(new EcouteBouton()); add(button); } class EcouteBouton implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println("tu as cliqué"); juin 2006 Brigitte Groléas

ActionEvent ActionListener JButton : Action Event activé sur click L'utilisateur veut déclencher une action, Clic de bouton JButton : Action Event activé sur click JList : Action Event Activé sur sélection (double click) JTextField : Action Event Activé sur ENTER ActionListener juin 2006 Brigitte Groléas

Changement de l'état de sélection Sélection d'items Changement de l'état de sélection public class Essai extends Panel{ Choice c; public Essai() { c = new Choice(); c.add("Rouge") .... c.addItemListener(new EcouteListe()); } class EcouteListe implements ItemListener { public void itemStateChanged(ActionEvent event) { System.out.println(c.getSelectedItem()); juin 2006 Brigitte Groléas

Sélection d'items du menu JMenuItem menu = new JMenuItem("Pascal"); menu.addActionListener(new LanguageMenuListener()); public class LanguageMenuListener implements ActionListener { public void actionPerformed(ActionEvent evt) { System.out.println("Menu: " + evt.getActionCommand()); } juin 2006 Brigitte Groléas

À vous … Dans le menu créé à l’exemple précédent Faire afficher au milieu de l’écran les widjets sélectionnées dans le menu awt ( et uniquement elles). Lors de la sélection d’un des menus du sous menu swing, afficher ‘inconnu pour l’instant’ juin 2006 Brigitte Groléas

Changement d'un texte textField.addTextListener(new DebugTextListener()); textArea.addTextListener(new DebugTextListener()); } class DebugTextListener implements TextListener { public void textValueChanged(TextEvent event) { Object obj = event.getSource(); System.out.println(obj.toString()); juin 2006 Brigitte Groléas

Implementation par interface JButton bOk = new JButton("Press Me"); bOk.addMouseListener(new ButtonMouseListener()); class ButtonMouseListener implements MouseListener { public void mouseEntered(MouseEvent event) { System.out.println("Mouse Entered Button"); } public void mouseExited(MouseEvent event) { System.out.println("Mouse Exited Button"); public void mousePressed (MouseEvent event) { } public void mouseClicked (MouseEvent event) { } public void mouseReleased(MouseEvent event) { }} juin 2006 Brigitte Groléas

Listener vs adaptater Les listeners sont des interfaces, il est indispensable d'implémenter toutes les méthodes définies. Et elles sont parfois nombreuses fastidieux long Les adaptateurs sont des classes contenant des méthodes de corps vides à surcharger si besoin. L'utilisation d'adaptateur est souvent plus simple à implémenter. juin 2006 Brigitte Groléas

Fermeture de la fenêtre addWindowListener(new MyWindowListener()); public class MyWindowListener extends WindowAdapter { public void windowClosing(WindowEvent evt) { System.out.println("Fermeture"); System.exit(0); } juin 2006 Brigitte Groléas

Adapter : implémente les méthodes JButton button = new JButton("Valider"); button.addMouseListener(new ButtonMouseListener()); class ButtonMouseListener extends MouseAdapter { public void mouseEntered(MouseEvent event) { System.out.println("Bouton enfoncé"); } public void mouseExited(MouseEvent event) { System.out.println("Bouton laché");} juin 2006 Brigitte Groléas

Comment accéder aux composants public class Essai extends JPanel{ JTextField saisie; public Essai() { saisie = new JTextField(); add(saisie); JButton button = new JButton("Clic ici"); EcouteBouton ec = new EcouteBouton(this); button.addActionListener(ec ) ; add(button); } class EcouteBouton implements ActionListener { ... juin 2006 Brigitte Groléas

Lien "Has-a" public class Essai extends JPanel{ JTextField saisie; public Essai() { saisie = ... JButton button = ... button.addActionListener(new EcouteBouton(this)); } class EcouteBouton implements ActionListener { Essai essai; EcouteBouton (Essai essai) { this.essai = essai; public void actionPerformed(ActionEvent event) { System.out.println(essai.saisie.getText()); juin 2006 Brigitte Groléas

Inner classe public class Essai extends JPanel{ saisie = ... private JTextField saisie; public Essai() { saisie = ... JButton button = ... button.addActionListener(new EcouteBouton()); } class EcouteBouton implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println(saisie.getText()); juin 2006 Brigitte Groléas

Classe anonyme JButton bOk = new JButton( "Valider" ); bOK.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { System.out.println( "Cliqué !" ); } ); fenetre.add( bOk ); juin 2006 Brigitte Groléas

à vous … Exercice ce synthèse Les listes déroulantes permettent de modifier la couleur du fond/texte de ‘coucou’ Les cases à cocher ‘Forme’ permettent de modifier l’alignement de ‘coucou’ Les boutons Majuscules et Minuscules servent à modifier la casse Nouveau Texte, permet de remplacer le texte ‘coucou’ Effacer efface le texte ‘coucou ‘ Détails permet de saisir un nouvel élément dans la liste sélection juin 2006 Brigitte Groléas

Modele MVC Modèle : Vue : Apparence du composant Contrôleur : Le contenu du composant valeur d'un champ, etat . ne possède pas d'interface utilisateur. Possède les méthodes de modification et d'accès au contenu. Vue : Apparence du composant une classe abstraite permet de définir les décorateurs sa police, sa couleur Possède les méthodes de dessin Contrôleur : gestion des interactions (réactions aux événements) juin 2006 Brigitte Groléas

juin 2006 Brigitte Groléas

JTable public class TablePlanetes extends JPanel{ private Object[][] cellules = { {"mercure", new Double(1111), new Integer(0), "non"}, {"Vénus", new Double(2345), new Integer(0), "non"}, {"Terre", new Double(3456), new Integer(1), "non"}, {"Mars", new Double(4444), new Integer(2), "oui"}, {"Jupiter", new Double(6578), new Integer(16), "non"} }; private String [] columnNames ={ "planetes", "Rayon", "Lunes", "Gazeuse"}; public TablePlanetes() { JTable table = new JTable( cellules, columnNames ); add(new JScrollPane(table)); } juin 2006 Brigitte Groléas

Modèle de données TableModel régit la gestion des données Les données sont calculées ou stockées Les méthodes sont implémentées dans la classe AbstractTableModel sont abstraites : public int getRowCount() : nbre de lignes public int getColumnCount() : nbre de col public int getValueAt() : contenu des cellules Le modèle est associé à la table Modèle par défaut : DefaultTableModel, il faut étendre AbstractTableModel juin 2006 Brigitte Groléas

Implémentation public class TableAvecModele1 extends JPanel { ModeleDeDonnées skin = new ModeleDeDonnées(); JTable jt = new JTable(skin); add(jt); } class ModeleDeDonnées extends AbstractTableModel { public int getColumnCount() { return 3; } public int getRowCount () { return 5; } public Object getValueAt( int row, int col) { String s = « coucou »; return s; } juin 2006 Brigitte Groléas

Implémentation public class TableAvecModele1 extends JPanel { private Object[][] cellules = { {"mercure", ... }; private String [] columnNames = { "planetes", se"}; TableAvecModele1() { Modele2 mm = new Modele2(cellules, columnNames); JTable jt = new JTable(mm); add(new JScrollPane(jt)); } public class Modele2 extends AbstractTableModel { ... ModeleDeDonnées2(Object[][] cellules, String [] columnNames) {...} int getColumnCount() {return columnNames.length; } int getRowCount () {return cellules.length; } Object getValueAt( int row, int c) {return cellules[row][c]; } String getColumnName(int c){return columnNames[c]; } juin 2006 Brigitte Groléas

Trier une JTable Le tri doit se faire sur la vue et non sur le modèle on crée un filtre de modèle (comme un filtre de stream) qui intervient entre le modèle et la table Le tri garde une permutation virtuelle des lignes juin 2006 Brigitte Groléas

Implémentation public class TableAvecModele1 extends JPanel { ModeleDeTri tri; TableAvecModele1() { Model2 mm = new Model2(cellules, columnNames); tri = new ModeleDeTri (mm); JTable jt = new JTable(tri); add(new JScrollPane(jt)); } juin 2006 Brigitte Groléas

Squelette de la classe de tri public class ModeleDeTri extends AbstractTableModel { Model2 modele; public ModeleDeTri(Model2 m) {... } public void sort() { ... } public Object getValueAt(int r, int c) {... } public int getRowCount(){ ...} public int getColumnCount(){ ...} public String getColumnName(int c){ ...} private class Ligne implements Comparable { ...} } Référence sur le modèle réel juin 2006 Brigitte Groléas

Le constructeur public ModeleDeTri(Model2 m) { model = m; lignes = new Ligne[model.getRowCount()]; for (int i = 0; i < lignes.length; i++) { lignes[i] = new Ligne(); lignes[i].index = i; } juin 2006 Brigitte Groléas

Le tri public void sort() { Arrays.sort(lignes); } sort est une méthode static de la classe Arrays juin 2006 Brigitte Groléas

Les méthodes abstraites tient compte del'ordre virtuel Object getValueAt(int r, int c) { return model.getValueAt(lignes[r].index, c); } int getRowCount(){ return model.getRowCount(); } int getColumnCount(){ return model.getColumnCount(); } String getColumnName(int c){ return model.getColumnName(c);} juin 2006 Brigitte Groléas

Le tri par ligne private class Ligne implements Comparable { public int index; public int compareTo(Object autre) { Ligne autreLigne = (Ligne)autre; Object cellule = model.getValueAt(index, colonneTri); Object autreCellule = model.getValueAt(autreLigne.index, colonneTri); return ((Comparable)cellule).compareTo(autreCellule ); } juin 2006 Brigitte Groléas

Clic sur un nom de colonne public void addEcouteur(final JTable table) { table.getTableHeader().addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent event) { if (event.getClickCount() < 2) return; int tableColumn = table.columnAtPoint(event.getPoint()); int modelColumn = table.convertColumnIndexToModel(tableColumn); sort(modelColumn); } }); Au double clic sur une colonne, on récupère le numéro de la colonne dans le modèle juin 2006 Brigitte Groléas

boolean TableModel.isCellEditable(int l, int c) int JTable.columnAtPoint(Point p)renvoie l’indice de la colonne du tableau où est le point int JTable.convertColumnIndexToModel(int colonne)renvoie l’indice, dans le modèle, de l’indice colonne juin 2006 Brigitte Groléas