Component - Container

Transcription

Component - Container
Plan
Objectif : maitriser le développement d’interfaces graphiques en Java
 connaissance des API AWT et Swing de composants graphiques
 gestion des événements et du comportement de ces composants
 apprentissage d’une bonne pratique de structuration des applications (modèle MVC)
Plan
1- rappels sur AWT, ses conteneurs, ses composants
2- Swing, ses containers, ses composants les plus simples
3- Les gestionnaires de géométrie en Java
4- Gestion des événements en Java
5- Le MVC : Modèle Vue Controleur
6- Le MVC dans Swing, JTree, JList, JTable
Bibliographie : java.sun.com (API et tutoriaux)
Interfaces graphiques en Java
1
Les interfaces graphiques en Java
 Les programmes à interfaces graphiques font usage
des classes awt (package java.awt) et/ou
swing (package javax.swing).
 Ces classes représentent des composants
graphiques, des conteneurs de composants,
des utilitaires de placement des composants
dans les conteneurs et des classes d’interaction
utilisant le modèle d’événement Java
Interfaces graphiques en Java
2
Généralités sur AWT (1/2)
 Historiquement, AWT (Abstract Window Toolkit) est la première API
graphique de Java (version 1.0 du JDK).
 AWT utilise au maximum le système graphique sous-jacent, via la
machine virtuelle Java qui fait appel au système graphique natif (MS
windows, X Windows, Mac OS X, ...).
package java.awt;
public class Button{
Composant Bouton
de MS Windows
...
}
Interfaces graphiques en Java
3
Généralités sur AWT (2/2)
 Avantages :
 l’aspect et le comportement des applications graphiques est conforme à
ceux des autres applications qui tournent sur le même OS
 l’application bénéficie de l’efficacité, en terme de rapidité, des composants
graphiques natifs
 pas besoin de réimplémenter tout les composants
 Inconvénients :
 ne permet de fournir que les composants graphiques disponibles pour
toutes les plateformes
 impossibilité de garantir une uniformité des comportements et des
apparences d’une même application d’un OS à l’autre
Interfaces graphiques en Java
4
Généralités sur Swing (1/2)
 Swing est une extension de AWT, et existe depuis
le JDK 1.2. JFC (Java Fundation Classes) =
Java2D + copier/coller entre applications + Swing
 Swing a adopté l’approche inverse : faire le moins
possible appel aux composants graphiques de
l’OS, et uniquement pour des opérations de base
(ouvrir une fenêtre, dessiner une ligne ou du texte,
gérer les événements).
package java.awt;
public class JButton{
dessin de lignes sous
MS Windows
...
public void paint(){
...
}
}
Interfaces graphiques en Java
5
Généralités sur Swing (2/2)
 Avantages :
 Apparence et comportement indépendants des plateformes (Look and Feel)
 Possibilités d’introduire de nouveaux composants pour toutes les plateformes
(Swing est bien plus riche qu’AWT)
 Inconvénients :
 Besoin de réimplémenter les composants existants dans les OS
 Les applications n’ont pas forcément les mêmes apparences et
comportements que les autres applications de l’OS
 Les applications sont moins rapides (?)
Interfaces graphiques en Java
6
Les classes AWT
Interfaces graphiques en Java
7
Les conteneurs AWT
 Container classe générale qui regroupe
des composants, responsable du layout
 Window conteneur pour interaction avec le
système
 Frame fenêtre principale d'application
 Dialog fenêtre d’interaction avec
l’utilisateur
 Panel conteneur de base
 Applet pour exécution dans un navigateur
(package applet)
 ScrollPane intègre un conteneur
d'ascenseurs
Interfaces graphiques en Java
Component
Container
Window
Frame
Dialog
FileDialog
Panel
applet.Applet
ScrollPane
8
Utilisation des containers
public class ContainerTest extends Frame {
public ContainerTest(){
super("ContainerTest");
Panel p = new Panel();
p.setBackground(Color.YELLOW);
this.add(p);
this.setSize(300,200);
this.setVisible(true);
p.getGraphics().drawString("Bonjour le monde!!", 50,50);
}
ContainerTest
}
public ContainerTestBis(){
super("ContainerTestBis");
this.setBackground(Color.YELLOW);
this.setSize(300,200);
this.setVisible(true);
Dialog d = new Dialog(this,"Dialoguer avec moi",true);
d.setSize(100,50);
d.setResizable(false);
d.setVisible(true);
}
ContainerTestBis
public void paint(Graphics g){
g.drawString("Bonjour le monde!!", 50,50);
}
Interfaces graphiques en Java
9
Applet
 Applet est un Panel spécialisé. Une instance de Applet est
incorporée dans un conteneur pour exécution. Une instance de
Applet n'est donc pas une application autonome.
 Elle peut être incluse dans une
page Web.
 Elle récupère les paramètres
de la balise <PARAM... du
code HTML via la méthode
getParameter(String)
Interfaces graphiques en Java
<APPLET
[CODEBASE = url du répertoire]
CODE = fichier de l'applette
WIDTH = largeur du conteneur
HEIGTH = sa hauteur
[ALT = texte de remplacement]
[ARCHIVE = fichiers archives]
[NAME = nom de l'instance de l'applette ]
[ALIGN = top, middle, left (dans la page)]
[VSPACE = marges haute et basse]
[HSPACE = marges gauche et droite]
>
[<PARAM NAME = nom VALUE = sa valeur>]
[<
... >]
</APPLET>
10
Cycle de vie de Applet
 Une instance de Applet est active ou inactive :
 au chargement, inactive
 au premier affichage, devient active
 selon le contexte, devient inactive
• si elle sort de la partie visible de la page
• si une autre page est activée
 Méthodes de gestion




init() création, inactive
start() mise en route, activation
stop() arrêt, désactivation
destroy() quand on quitte le programme.
 Une instance de Applet est exécutée dans un navigateur Web avec
certaines restrictions (lecture/écriture/exécution sur le disque local,
connection à d'autre machine que sa machine d'origine, ...)
Interfaces graphiques en Java
11
Les composants AWT (1/2)
Canvas pour le dessin, Choices est un
menu déroulant, CheckboxGroup
composant logique de regroupement de cases
à cocher, TextArea propose plusieurs lignes
alors que TextField n’en propose qu’une
MenuBar
Label
TextField
Choice
List
Checkbox
Object
Component
Canvas
TextComponent
TextField
TextArea
List
Label
Button
Choice
Scrollbar
Checkbox
CheckboxGroup
Button
Interfaces graphiques en Java
12
Les composants AWT (2/2)
 Comportements communs à tous les composants :
 activation/désactivation du composant (réaction ou non aux actions de
l’utilisateur) : setEnabled(boolean) et isEnabled()
 visibilité/invisibilité du composant : setVisible(boolean) et isVisible()
 font du composant : setFont(java.awt.Font)
 apparence du curseur sur le composant : setCursor(java.awt.Cursor)
 couleur de fond : setBackground(java.awt.Color)
 couleur de travail : setForeground(java.awt.Color)
 et bien d’autres ...
Interfaces graphiques en Java
13
Les menus d’AWT
MenuComponent est abstraite, Menu est
une sous-classe de MenuItem
par le design pattern des conteneurs
Object
MenuComponent
MenuBar
MenuBar mb = new MenuBar();
Menu m1 = new Menu("Languages");
Menu procedural = new Menu("Procedural");
procedural.add(new MenuItem("C"));
procedural.add(new MenuItem("Pascal"));
Menu objectOriented = new Menu("Object Oriented");
objectOriented.add(new MenuItem("Smalltalk"));
objectOriented.add(new MenuItem("Java",new
MenuShortcut(KeyEvent.VK_F10)));
objectOriented.add(new MenuItem("Eiffel"));
objectOriented.add(new MenuItem("C++"));
Menu functional = new Menu("Functionnal");
functional.add(new MenuItem("Caml"));
functional.add(new MenuItem("LISP"));
m1.add(procedural);
m1.add(objectOriented);
m1.add(functional);
mb.add(m1);
this.setMenuBar(mb);
Interfaces graphiques en Java
MenuItem
CheckboxMenuItem
Menu
PopupMenu
MenuShortcut
MenuTest
14
Les classes Swing (1/2)
 Les classes similaires à AWT
 réimplémentent les composants
AWT
 ajoutent de nouveaux composants
dérivés des composants AWT
 implémente le MVC (modèle, vue,
contrôle)
Interfaces graphiques en Java
15
Les classes Swing (2/2)
 Les classes nouvelles
 des types de Panel nouveaux pour
davantage structurer les conteneurs
 des conteneurs particuliers bien utile
(JToolBar, JProgressBar, ...)
 des conteneurs généraux « lourds » :
JFrame, JWindow, JApplet, JDialog
Interfaces graphiques en Java
16
JFrame (1/2)
 Une JFrame est la classe de base pour une application graphique
 Une JFrame contient une instance de la classe JRootPane
 Le Root Pane contient deux conteneurs, glassPane (JPanel) et
layeredPane (JLayeredPane)
 La layeredPane contient deux conteneurs, contentPane
(Container) et menuBar (null ou JMenuBar)
 On travaille dans contentPane par la méthode
getContentPane()
 JApplet, JWindow et JDialog sont semblables.
Interfaces graphiques en Java
17
JFrame (2/2)
 Une JFrame n'est par défaut pas affichée, il est nécessaire de la
rendre visible par setVisible(boolean)
 Par défaut, si on ferme la fenêtre, elle devient invisible mais n'est
pas détruite. La méthode dispose() libère les ressources utilisées
par JFrame en détruisant l'objet et ce qu'elle référence.
 Possibilité de spécifier le comportement à la clôture de la fenêtre par
la méthode setDefaultCloseOperation(int) les opérations
étant DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE,
HIDE_ON_CLOSE, EXIT_ON_CLOSE
 JFrame offre des méthodes de dimensionnement et de placement :
setLocation, setSize, setResizable
Interfaces graphiques en Java
18
Les couches de JFrame : JRootPane
 Le seul composant direct de JWindow,
JDialog, JFrame, JApplet et
JInternalFrame
 Un JRootPane a deux parties terminales :
glassPane et contentPane. menuBar
est optionnel. layeredPane gère la
géométrie des composants de
contentPane et menuBar
 Le glassPane (de type JPanel) sert à
capter des évènements souris.
 Les composants sont ajoutés via le
contentPane :
frame.getContentPane().add(child);
Interfaces graphiques en Java
19
Les couches de JFrame : JLayeredPane
 Conteneur général pour des composants en couche.
 On peut donner des valeurs de niveau aux composants indiquant qui
est affiché au dessus.
 Classe mère de JDesktopPane.
 La profondeur d’une couche est représenté par un objet Integer.
 Six profondeurs prédéfinies :






FRAME_CONTENT_LAYER (-30000): le contentPane est de ce niveau
DEFAULT_LAYER (0): niveau “par défaut”
PALETTE_LAYER (100): pour les palettes, boîtes à outils déplaçables
MODAL_LAYER (200): pour les dialogues modaux
POPUP_LAYER (300): pour les menus glissants, les tooltips
DRAG_LAYER (400): pour le glisser-déposer
 L’affichage est évidemment en ordre croissant
Interfaces graphiques en Java
20
Barres d’outils en Swing
 JToolBar est un conteneur général, qui se redimensionne et peut
être déplacé. Il contient classiquement des boutons groupés
horizontalement ou verticalement. Il utilise un BoxLayout
(horizontal par défaut).
 Les composants d'une barre d'outils sont a priori des boutons (mais
potentiellement tout type de composant)
JToolBar jtb = new JToolBar();
jtb.setFloatable(true);
jtb.setRollover(true);
jtb.add(new JButton("New"));
jtb.add(new JButton("Open"));
jtb.addSeparator();
Icon ic = new ImageIcon("java.gif");
jtb.add(new JButton("Java",ic));
jtb.add(new JRadioButtonMenuItem ("ON/OFF"));
this.getContentPane().add(jtb, BorderLayout.PAGE_START);
JToolBarTest
Interfaces graphiques en Java
21
Menus en Swing
 Un menu a des entrées qui sont JMenuItem,
JCheckBoxMenuItem, JRadioButtonMenuItem, JSeparator,
et JMenu.
JMenuBar jmb = new JMenuBar();
JMenu file = new JMenu ("File");
file.add(new JMenuItem ("New"));
file.add(new JMenuItem ("Open"));
file.addSeparator();
file.add(new JMenuItem ("Close"));
jmb.add(file);
....
this.setJMenuBar(jmb);
JMenuTest
 JPopupMenu sert pour les menus dynamiques (clic droit)
Interfaces graphiques en Java
22
Autres conteneurs Swing
 JPanel est un conteneur très général, dérive immédiatement de
JComponent, est opaque (important pour les dessins), doublement
bufferisé (améliore la fluidité de l’affichage)
 JDesktopPane est un conteneur pour gérer des JInternalFrame
 Le JTabbedPane est un conteneur à navigation par onglets
 Le JScrollPane intègre des ascenceurs et permet de n’afficher
qu’une partie d’une zone
 Le JSplitPane introduit un volet mobile entre deux composants
Interfaces graphiques en Java
23
JInternalFrame
 JInternalFrame est une frame qui apparait à l'intérieur d'un
composant. Le plus souvent, on l'ajoute au DesktopPane d'une
JFrame.
public class JInternalFrameTest extends JFrame{
public JInternalFrameTest(){
super("JInternalFrameTest");
JInternalFrame intern = new JInternalFrame("Fenêtre
interne");
intern.getContentPane().add(new JLabel("Je suis une
fenêtre interne"));
intern.setVisible(true);
intern.setSize(200,300);
intern.setResizable(true);
intern.setIconifiable(true);
intern.setMaximizable(true);
JDesktopPane desk = new J DesktopPane();
desk.add(intern);
this.setContentPane(desk);
this.setSize(400,600);
this.setVisible(true);
}
JInternalFrameTest
}
Interfaces graphiques en Java
24
JTabbedPane
public class JTabbedPaneTest extends JFrame{
public JTabbedPaneTest() {
super("JTabbedPaneTest");
String tabs[] = {"C++", "Java", "Eiffel", SmallTalk"};
JTabbedPane tabbedPane = new JTabbedPane();
this.setLayout (new BorderLayout());
for (int i=0;i<tabs.length;i++){
JPanel p = new JPanel();
p.add(new JLabel("Panel "+(i+1)));
tabbedPane.addTab (tabs[i], null, p);
}
tabbedPane.setSelectedIndex(0);
tabbedPane.setMnemonicAt(2,KeyEvent.VK_E);
tabbedPane.setIconAt(1,new ImageIcon("java.gif"));
this.getContentPane().add(tabbedPane,BorderLayout.CENTER);
this.setSize(200,400);
this.setVisible(true);
}
public static void main(String[] args){
new JTabbedPaneTest();
}
JTabbedPaneTest
}
Interfaces graphiques en Java
25
JScrollPane
 Gère automatiquement des ascenseurs autour
de son composant central qui est un JViewPort.
public class JScrollPaneTest extends JFrame{
public JScrollPaneTest() {
super("JScrollPaneTest");
JLabel comp = new JLabel(new ImageIcon("Madagascar.JPG"));
JScrollPane scrollPane = new JScrollPane(comp);
this.getContentPane().add (scrollPane);
this.setSize(200,400);
this.setVisible(true);
}
public static void main(String[] args){
new JScrollPaneTest();
}
}
JScrollPaneTest
Interfaces graphiques en Java
26
JSplitPane
 Panneau à compartiments, chaque
compartiment est ajustable
 Panneau à séparation verticale ou
horizontale
JLabel mad = new JLabel(new ImageIcon("Madagascar.JPG"));
JScrollPane scrollPane = new JScrollPane(mad);
JLabel one = new JLabel("Panel ONE");
JLabel two = new JLabel("Panel TWO");
JSplitPane right = new JSplitPane(JSplitPane.VERTICAL_SPLIT,one,two);
right.setDividerSize(20);
right.setDividerLocation(0.1);
JSplitPane left = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,new
JScrollPane(mad),right);
left.setOneTouchExpandable(true);
this.getContentPane().add(left);
JSplitPaneTest
Interfaces graphiques en Java
27
Les composants Swing (1/3)
 Comportements ajoutés à
Component :
 gestion d’une bulle d’aide :
setToolTipText(String)
 gestion de l’opacité :
setOpaque(boolean) et
isOpaque()
Container
JComponent
Window
AbstractButton
JToggleButton
Dialog
JCheckBox
JDialog
JRadioButton
JButton
JLabel
JTree
JToolTip
JFileChooser
JSpinner
JColorChooser
JSlider
JComboBox
JTable
JInternalFrame
JList
JProgressBar
JOptionPane
Interfaces graphiques en Java
28
Les composants Swing (2/3)
Interfaces graphiques en Java
29
Les composants Swing (3/3)
Interfaces graphiques en Java
30
Les composants texte
 Ils dérivent de JTextComponent :




JTextField permet d'afficher une ligne de texte, éditable ou non
JPasswordField permet la saisie d'une ligne de texte en affichant des étoiles
JTextArea permet d'afficher un texte multi-lignes dans un style donné
JEditorPane et JTextPane permettent d'afficher du texte en modes texte,
HTML ou RTF, à partir de fichiers sources. Le style du texte peut ne pas être
uniforme
Interfaces graphiques en Java
31
ButtonGroup
 Une instance de ButtonGroup permet de grouper des boutons
(AbstractButton qui regroupe JButton,JCheckBox,
JRadioButton, et les équivalents en JMenuItem) de façon à ce
qu'un seul soit sélectionné.
 Un ButtonGroup n'est pas un composant, les boutons doivent être
ajoutés dans un container.
ButtonGroup bg = new ButtonGroup();
JRadioButton oui = new JRadioButton("OUI");
bg.add(oui);
JRadioButton non = new JRadioButton("NON");
bg.add(non);
JCheckBox pe = new JCheckBox("PEUT ETRE");
bg.add(pe);
JToolBar jtb = new JToolBar();
jtb.setFloatable(true);
jtb.setRollover(true);
jtb.add(oui);
jtb.add(non);
jtb.add(pe);
this.getContentPane().add(jtb, BorderLayout.PAGE_START);
Interfaces graphiques en Java
ButtonGroupTest
32
JToolTip
 JToolTip sert à ajouter des bulles d'aide sur les
composants.
 On peut créer ses propres formats de bulles d'aide
en subclassant JToolTip et en redéfinissant la
méthode setToolTipText de JComponent
Button b = new Button("bouton");
b.setToolTipText("je suis un bouton");
TooTipTest
Interfaces graphiques en Java
33