Java : Graphique Swing
-
Upload
steven-edwards -
Category
Documents
-
view
84 -
download
9
description
Transcript of Java : Graphique Swing
juin 2006 Brigitte Groléas 1
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.*;
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
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);
}}
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
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);
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);
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()
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
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);
...
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);
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 :
juin 2006 Brigitte Groléas 13
à vous ...
coucou 1
Coucou 2 coucou5 coucou 7Coucou 3 coucou 8 coucou 9Coucou 4 coucou 10
coucou 6
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 );
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
juin 2006 Brigitte Groléas 16
Quelques widgets
JLabel
JComboBox
JCheckBox
JList
JButton
JTextField
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");
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 );
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();
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
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
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);
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é
juin 2006 Brigitte Groléas 24
À vous …
Dessinez cet écran
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);
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);
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);
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
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)
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 :
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);
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.
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).
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
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 ...
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é"); }}
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
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());
} }}
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()); }}
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’
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()); }}
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) { }}
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.
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); } }
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é");}}
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 {...
}
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());
}}
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());
} }}
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 );
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
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
juin 2006 Brigitte Groléas 52
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));
}
}
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
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; }
}
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]; }
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
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));}
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
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; } }
juin 2006 Brigitte Groléas 61
Le tri
public void sort() { Arrays.sort(lignes); }
sort est une méthode static de la classe Arrays
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
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 );
}}
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
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