3 Java Swing
3 Java Swing
JAVA : Interface
Graphique Composent
graphique, événement
Plan
1. Interface Graphique
2. Evénements
1
19/12/202
4
Java et fenêtre
2
19/12/202
4
Java et fenêtre
• Pour :
– un aspect et comportement (look and feel) comme les
autres de la plateforme
– pas besoin de refaire les composants, juste s’adapter
• Contre
– un catalogue restreint : l’intersection des GUI
– le comportement et l’aspect dépendent donc de la 6
3
19/12/202
4
• Pour :
– moins de différences entre plateformes
– plus de liberté pour créer et ajouter des (nouveaux) composants
• Contre :
– faut « tout faire »
– les applications Java n’ont pas le même look and feel que les autres.
– un peu plus lent
7
Architecture Swing
4
19/12/202
4
Racine (composé)
correspond à
une fenêtre de
l’appli
Nœuds (composé)
Structure visuel ou
Feuille (simple)
avec lesquels
l’utilisateur peut
9
10
5
19/12/202
4
6
19/12/202
4
13
Conteneurs intermédiaires
14
7
19/12/202
4
Composants atomiques :
les contrôles de bases (interactives,
widgets)
JButton
JSlider
JComboBox
JTexField
JCheckBox
JRadioButton
JList
15
JProgressBar JSeparator
JLabel
JToolTip
16
8
19/12/202
4
Plus
compliqués
JColorChooser
JEditorPane and
JTextPane
JTextArea
JTree
JFileChooser
17
Java Doc:
[Link]
cs/api/ [Link]/javax/swing/package-
[Link]
18
9
19/12/202
4
import [Link].*;
[Link]("example 1");
[Link]
(JFrame.EXIT_ON_CLOSE);
[Link](100,50);
[Link](true);
}
}
19
import [Link].*;
import [Link].*;
Container contentPane =
[Link](); [Link](new
JLabel("Swing Demo 2"));
[Link](new FlowLayout());
[Link](new JButton("clique ici"));
}
public static void main(String[] Déplacer le
args{ JFrame frame = new contenu de
SwingDemo2() init() dans le
constructeur
((SwingDemo2)frame).init();
[Link](200,200);
[Link](true);
} 20
10
19/12/202
4
import [Link].*;
import [Link].*;
[Link](new FlowLayout());
for(int i = 0; i < 20; i++)
[Link](new JButton("Button " + i));
}
import [Link].*;
import [Link].*;
[Link](new GridLayout(7,3));
for(int i = 0; i < 20; i++)
[Link](new JButton("Button " + i));
}
11
19/12/202
4
23
12
19/12/202
4
For more :
[Link]
25
BorderLayout : 5 composants :
• North, South, East, West et Center.
26
13
19/12/202
4
GridLayout : en grille
27
14
19/12/202
4
29
30
15
19/12/202
4
Interaction, programmation
événementielle
• Le principal objectif d'une application
graphique est la programmation
événementielle :
– l'utilisateur peut déclencher des événements et
réagir à ce qui se passe dans la fenêtre.
– La communication est « asynchrone »
– Au contraire d'un programme en mode console,
dans lequel le programme régit les actions de
l'utilisateur à sa guise (synchrone).
16
19/12/202
4
Interaction, programmation
événementielle
• Exemple d’un bouton :
– Un bouton est un élément graphique sur lequel
l'utilisateur peut cliquer pour déclencher une
action.
– Le bouton ne fait rien tant que l'utilisateur n'a
pas cliqué dessus.
– Lors d’un clique un événement est crée ...
reste à le traiter !
17
19/12/202
4
• Attention :
– il y a un seul thread (EDT) pour traiter les
événements et redessiner.
– L’EDT traite un événement après l’autre.
– Il faut attendre la fin du traitement pour passer
à autre chose.
35
18
19/12/202
4
37
38
19
19/12/202
4
Les sources :
• Boutons : JButton, JRadioButton, JCheckBox,
JToggleButton
• Menus : JMenuItem, JMenu,
JRadioButtonMenuItem, JCheckBoxMenuItem
• Texte : JTextField
• ...
Les auditeurs :
• Il faut implémenter l’interface qui correspond au
type de l’événement
• e.x. ActionEvent => ActionListener :
public interface ActionListener extends EventListener {
/** Invoked when an action occurs.*/
} 39
Evénements / Auditeur
20
19/12/202
4
listener
import [Link].*;
import [Link].*;
import [Link];
import [Link];
// ComponentListener methods
public void componentHidden(ComponentEvent e) {
displayMessage([Link]().getClass().getName() public static void main(String[] args)
+ " --- Hidden"); {
SwingDemoEvent1 frame = new
}
public void componentMoved(ComponentEvent e) { ... SwingDemoEvent1();
public void componentResized(ComponentEvent e) { ... [Link]();
public void componentShown(ComponentEvent e) { ... [Link](250,700);
[Link](true);
}
}
42
21
19/12/202
4
44
22
19/12/202
4
46
23
19/12/202
4
// Definition
public class Paquet {
24
19/12/202
4
String dest;
public Destination envoi(String s) {
dest =s;
Tarif et Destination sont
Tarif c = new Tarif(){ des interfaces
private int i = 10;
int value() { return i;}
};
public Un instance necessaire
50
25
19/12/202
4
}
inner
contenu de
class MyButtonActionListener implements ActionListener { class init() dans le
public void actionPerformed(ActionEvent e) {
clicCount++; constructeur
[Link]([Link](clicCount));
}
}
import [Link].*;
import [Link].*;
import [Link].*;
[Link](bl);
[Link](bl);
[Link](b1); [Link](200,200);
[Link](b2); [Link](true);
[Link](txt); }
}
} // end of SwingDemo3 class definition
26
19/12/202
4
plus concentrée
• Au lieu de “inner class”, utiliser “Anonymous Inner
classes"
– “new <nom-de-classe> ([ argument-list ])
• Cette construction fait deux choses :
– elle crée une nouvelle classe, sans nom, qui
est une sous-classe de <nom-de-classe>
définie par <corps>
– elle crée une instance (unique) de cette
nouvelle classe et retourne sa valeur
import ...
public SwingDemoEvent3() {
super("CursorFrame");
setSize(400, 200);
setLayout(new FlowLayout());
add(new JLabel("Click the mouse..."));
a = new JTextField("0", 4);
b = new JTextField("0", 4);
btn = new JButton("RESET");
add(a); add(b); add(btn);
anonymous
addMouseListener(new MouseAdapter() { inner classes
public void mousePressed(MouseEvent e) {
[Link]([Link]([Link]()));
[Link]([Link]([Link]()));
}
});
addWindowListener(new WindowAdapter() { public static void main(String[] args)
public void windowClosing(WindowEvent e) { { SwingDemoEvent3 app = new
setVisible(false); SwingDemoEvent3(); [Link](true);
dispose(); }
[Link](0);
} }
});
[Link](new ActionListener() {
public void actionPerformed(ActionEvent e) {
[Link]("0");
[Link]("0");
}
});
}
27
19/12/202
4
Exercice
55
[Link]
components/[Link]
56
28
19/12/202
4
Troisième
Troisième partie
partie : :
dessin
Dessiner son propre composant graphique
57
JButton
58
29
19/12/202
4
59
Le système de coordonnées
• Presque du
cartésien :
– (0,0) haut
gauche (width,0)
30
19/12/202
4
Fenêtre et sous-fenêtre
(wp, hp) 61
31
19/12/202
4
63
64
32
19/12/202
4
Graphics g = [Link]( );
Graphics2D g2 = (Graphics2D) g;
2. Peindre
[Link](x1,y1, x2,y2);
66
33
19/12/202
4
// my graphics:
[Link](new Color(255,0,0));
[Link](10,10,200,50); // left, top, width, height
[Link](new Color(0,0,0));
[Link]("Hello World", 20, 20);// S, left, BOTTOM
}
} Hello World
67
34
19/12/202
4
Quand repeindre ?
• L’écran est une feuille de dessin unique
– Toutes les fenêtres sont peintes sur la même feuille.
– Les fenêtres ne se souviennent pas de ce qu’elle cache.
– Besoin de repeindre, dès qu’une nouvelle zone de
l’écran apparait.
• événements de repaint
• ouverture, changement de dimension, mise au
premier (ou arrière) plan.
• quand d’autre fenêtre viennent modifier l’écran
69
70
35
19/12/202
4
71
72
36
19/12/202
4
73
74
37
19/12/202
4
// my graphics:
[Link](new Color(255,0,0));
[Link](10,10,200,50);
[Link](new Color(0,0,0));
[Link]("Hello World", 20, 20);
}
} Hello World
76
38
19/12/202
4
[Link]([Link].EXIT_ON_CLOSE);
[Link](250, 200);
[Link](true);
}
} 77
Flashing, un problème
• “Ugly flashing” pour le repaint:
• Paint background
• Redraw shapes
• Cette approche génère un effet visuel désagréable !
78
39
19/12/202
4
DoubleBufferring
• Dessiner tous un composant sur une image hors-écran :
– Paint background color
– Paint shapes
• Puis, dessiner l’image résultante dans le JPanel
• Swing le fait pour vous !! (avec setDoubleBuffered(b)
activé par défaut)
79
drawString et Antialiasing
40
19/12/202
4
81
import [Link].*;
import [Link].*;
Graphics2D car
public class SwingDemo7 extends JFrame { swing définit les
méthodes de
public JPanel panel; dessin avec ce
type là.
public void init() { Pas de maintient
Container cp = getContentPane();
de ce qui est
[Link]("example 7");
[Link](EXIT_ON_CLOSE);
dessiné, donc un
panel = new JPanel(); redimensionnem
[Link](panel);
}
public static void main(String[] args)
{
SwingDemo7 frame = new
SwingDemo7(); [Link]();
[Link](250,250);
[Link](true);
Graphics g = [Link]();
Graphics2D g2 = (Graphics2D) g;
[Link]( [Link] );
41