Java : Graphique Swing

65
juin 2006 Brigitte Groléas 1 Java : Graphique Swing

description

Java : Graphique Swing. Les API. 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.*;. Les principes. Container - contient des widgets ou des containers - PowerPoint PPT Presentation

Transcript of Java : Graphique Swing

Page 1: Java :  Graphique Swing

juin 2006 Brigitte Groléas 1

Java : Graphique Swing

Page 2: Java :  Graphique Swing

juin 2006 Brigitte Groléas 2

Les API

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 java.awt.*;

import javax.swing.*;

Page 3: Java :  Graphique Swing

juin 2006 Brigitte Groléas 3

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

Page 4: Java :  Graphique Swing

juin 2006 Brigitte Groléas 4

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

}}

Page 5: Java :  Graphique Swing

juin 2006 Brigitte Groléas 5

Hiérarchie des classes

B utton C anvas C heckbox C hoice

Label L ist Scrollbar

TextF ield TextArea

TextC om ponent

Applet

Panel ScrollPane

Fram e

FileD ialog

D ialog

W indow

C ontainer

C om ponent

Page 6: Java :  Graphique Swing

juin 2006 Brigitte Groléas 6

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

Page 7: Java :  Graphique Swing

juin 2006 Brigitte Groléas 7

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

Page 8: Java :  Graphique Swing

juin 2006 Brigitte Groléas 8

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

Page 9: Java :  Graphique Swing

juin 2006 Brigitte Groléas 9

Disposer les objets

Layout Manager : interface pour positionner les objets à l’intérieur d’un

container

Tout container doit avoir un disposeurJava pose un disposeur par défaut sur chaque contenair

Page 10: Java :  Graphique Swing

juin 2006 Brigitte Groléas 10

Les conteneurs 1

troisundeux

quatrecinq

FlowLayout f = new FlowLayout ();fen.setLayout(f);

NORTH

SOUTH

WEST EASTCENTERBorderLayout b = new BorderLayout();fen.setLayout(b);

JButton BB = new JButton(« ok »);fen.add(truc, BorderLayout.NORTH);

...

Page 11: Java :  Graphique Swing

juin 2006 Brigitte Groléas 11

Les conteneurs 2

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

Page 12: Java :  Graphique Swing

juin 2006 Brigitte Groléas 12

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 :

Page 13: Java :  Graphique Swing

juin 2006 Brigitte Groléas 13

à vous ...

coucou 1

Coucou 2 coucou5 coucou 7Coucou 3 coucou 8 coucou 9Coucou 4 coucou 10

coucou 6

Page 14: Java :  Graphique Swing

juin 2006 Brigitte Groléas 14

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

Page 15: Java :  Graphique Swing

juin 2006 Brigitte Groléas 15

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

Page 16: Java :  Graphique Swing

juin 2006 Brigitte Groléas 16

Quelques widgets

JLabel

JComboBox

JCheckBox

JList

JButton

JTextField

Page 17: Java :  Graphique Swing

juin 2006 Brigitte Groléas 17

JLabel et JButton

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

Page 18: Java :  Graphique Swing

juin 2006 Brigitte Groléas 18

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

Page 19: Java :  Graphique Swing

juin 2006 Brigitte Groléas 19

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

Page 20: Java :  Graphique Swing

juin 2006 Brigitte Groléas 20

Case à cocher

JCheckBox c1 = new JCheckBox("homme" , true); JCheckBox c2 = new JCheckBox("femme" , false); JCheckBox c3 = new JCheckBox("enfant" , false);

.setSelectedIcon(NomIcone) .setIcon(NomIcone)

sans lien

isSelected() : retourne true si la Checkbox est sélectionnée

setSelected(true) :pour que la case soit cochée

Page 21: Java :  Graphique Swing

juin 2006 Brigitte Groléas 21

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

Page 22: Java :  Graphique Swing

juin 2006 Brigitte Groléas 22

Liste

JComboBox  Liste non déroulante

Jlist Liste déroulante avec sélection multiple possible

String[] items = {"A", "B", "C", "D"}; JList list = new JList(items);

Object[] items2 = {new Integer(123), new java.util.Date()}; list = new JList(items2);

String[] items = {"item1", "item2"}; JComboBox aa = new JComboBox(items);

Page 23: Java :  Graphique Swing

juin 2006 Brigitte Groléas 23

Méthodes des listes

addItem(Object) setEditable(true) setSelectedItem(« Paris ») setMaximumRowCount(5)

getSelectedIndex(), retourne l’index de ll’item sélectionné

Page 24: Java :  Graphique Swing

juin 2006 Brigitte Groléas 24

À vous …

Dessinez cet écran

Page 25: Java :  Graphique Swing

juin 2006 Brigitte Groléas 25

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

Page 26: Java :  Graphique Swing

juin 2006 Brigitte Groléas 26

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

Page 27: Java :  Graphique Swing

juin 2006 Brigitte Groléas 27

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

Page 28: Java :  Graphique Swing

juin 2006 Brigitte Groléas 28

À vous …

Créer le menuAwt swing

bouton Jboutonliste Jlist

unique ComboBox sélections multiples

case à cocher exclusion

sélections multiples

Page 29: Java :  Graphique Swing

juin 2006 Brigitte Groléas 29

Les fontes

Font maFont = new Font (« serif »,Font.BOLD | Font.ITALIC, 32);

xxx.setFont( maFont )

Icon monIcone = new ImageIcon(«chat.gif ») Xxx.setIcon( monIcone)

Page 30: Java :  Graphique Swing

juin 2006 Brigitte Groléas 30

Les couleurs

13 constantes prédéfinies (Color.RED, Color.Blue ...)

Couleurs personnaliséesColor 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 :

Page 31: Java :  Graphique Swing

juin 2006 Brigitte Groléas 31

JColorChooser

 Dialogue permettant de choisir une couleur

Color c = JColorChooser.showDialog((JFrame) fenetre, "Choix de la couleur de fond", couleur);

Page 32: Java :  Graphique Swing

juin 2006 Brigitte Groléas 32

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.

Page 33: Java :  Graphique Swing

juin 2006 Brigitte Groléas 33

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

Page 34: Java :  Graphique Swing

juin 2006 Brigitte Groléas 34

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

Page 35: Java :  Graphique Swing

juin 2006 Brigitte Groléas 35

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 ...

Page 36: Java :  Graphique Swing

juin 2006 Brigitte Groléas 36

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

Page 37: Java :  Graphique Swing

juin 2006 Brigitte Groléas 37

ActionEvent

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 ENTERActionListener

Page 38: Java :  Graphique Swing

juin 2006 Brigitte Groléas 38

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

} }}

Page 39: Java :  Graphique Swing

juin 2006 Brigitte Groléas 39

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

Page 40: Java :  Graphique Swing

juin 2006 Brigitte Groléas 40

À 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’

Page 41: Java :  Graphique Swing

juin 2006 Brigitte Groléas 41

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

Page 42: Java :  Graphique Swing

juin 2006 Brigitte Groléas 42

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

Page 43: Java :  Graphique Swing

juin 2006 Brigitte Groléas 43

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.

Page 44: Java :  Graphique Swing

juin 2006 Brigitte Groléas 44

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

Page 45: Java :  Graphique Swing

juin 2006 Brigitte Groléas 45

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

Page 46: Java :  Graphique Swing

juin 2006 Brigitte Groléas 46

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 {...

}

Page 47: Java :  Graphique Swing

juin 2006 Brigitte Groléas 47

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

}}

Page 48: Java :  Graphique Swing

juin 2006 Brigitte Groléas 48

Inner classe

public class Essai extends JPanel{ 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());

} }}

Page 49: Java :  Graphique Swing

juin 2006 Brigitte Groléas 49

Classe anonyme

JButton bOk = new JButton( "Valider" );bOK.addActionListener(

new ActionListener() { public void actionPerformed( ActionEvent e ) {

System.out.println( "Cliqué !" ); }

}

); fenetre.add( bOk );

Page 50: Java :  Graphique Swing

juin 2006 Brigitte Groléas 50

à 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

Page 51: Java :  Graphique Swing

juin 2006 Brigitte Groléas 51

Modele MVC

Contrôleur : gestion des interactions

(réactions aux événements)

Modèle : 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écorateurssa police, sa couleur

Possède les méthodes de dessin

Page 52: Java :  Graphique Swing

juin 2006 Brigitte Groléas 52

Page 53: Java :  Graphique Swing

juin 2006 Brigitte Groléas 53

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

}

}

Page 54: Java :  Graphique Swing

juin 2006 Brigitte Groléas 54

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

Page 55: Java :  Graphique Swing

juin 2006 Brigitte Groléas 55

Implémentation

public class TableAvecModele1 extends JPanel {TableAvecModele1() {

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

}

Page 56: Java :  Graphique Swing

juin 2006 Brigitte Groléas 56

Implémentationpublic 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]; }

Page 57: Java :  Graphique Swing

juin 2006 Brigitte Groléas 57

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

Page 58: Java :  Graphique Swing

juin 2006 Brigitte Groléas 58

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

Page 59: Java :  Graphique Swing

juin 2006 Brigitte Groléas 59

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

Page 60: Java :  Graphique Swing

juin 2006 Brigitte Groléas 60

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

Page 61: Java :  Graphique Swing

juin 2006 Brigitte Groléas 61

Le tri

public void sort() { Arrays.sort(lignes); }

sort est une méthode static de la classe Arrays

Page 62: Java :  Graphique Swing

juin 2006 Brigitte Groléas 62

Les méthodes abstraites

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

tient compte del'ordre virtuel

Page 63: Java :  Graphique Swing

juin 2006 Brigitte Groléas 63

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

}}

Page 64: Java :  Graphique Swing

juin 2006 Brigitte Groléas 64

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

Page 65: Java :  Graphique Swing

juin 2006 Brigitte Groléas 65

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