vos premiers pas en swing partie structurelle audrey occello & am dery [email protected]

56
Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery [email protected]

Upload: pascal-ledoux

Post on 03-Apr-2015

103 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Vos premiers pas en Swing

Partie structurelle

Audrey Occello & AM Dery [email protected]

Page 2: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Des éléments graphiques : ComponentDéfinition d’un élément graphique avecune dimension, une position, un type de contrôle associé

Que trouve-ton dans une librairie graphique ?

Des éléments graphiques composés : Container Définition d’un regroupementDes éléments graphiques qui contiennent d’autres éléments graphiques

Du Formattage : LayoutManagerDéfinition de l’organisationEn ligne, en tableau, avec des contraintes,etc

Page 3: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Aperçu de Swing

Page 4: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

HIÉRARCHIE DES CLASSES

4

Page 5: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

PRINCIPES GÉNÉRAUX• Pour la création des composants :

1. Choix du container racine et création 2. Choix du panneau dans lequel on

dispose les composants (contenu)

• Pour l’affichage des composants1. Utilisation du layout par défaut ou

choix d’une mise en page des composants du container

2. Association de l’afficheur (LayoutManager) au container 5

IL PEUT Y AVOIR PLUSIEURS

PANNEAUX DANS UNE FENETRE

Page 6: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

• L’ajout d’un composant à un composant (container) implique la construction d’un sous arbre - le composant ajouté est le fils

• Le parent contient les composants qui lui sont ajoutés• La méthode getParent() sur un composant retourne le

parent (de type Container)

6On a donc une arborescence des composants

PRINCIPES GÉNÉRAUX

Page 7: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Exemple : ARBRE DE COMPOSANTS

7

Page 8: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Composants : Contrôles

8

COMMENT SAISIR & AFFICHER DES DONNEES ET PRESENTER DES ACTIONS ?

Page 9: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Aperçu de SwingDes composants de contrôle

Jcomponent

Méthodes de commodité• getSize retourne une Dimension• setSize : une Dimension ou deux entiers – Une position• getLocation retourne un Point• setLocation avec un Point ou deux entiers – Coordonnées• Origine au coin supérieur gauche – x (width) vers la droite – y (height) vers le bas

• setPreferredSize : Dimension• setMinimumSize : Dimension• setMaximumSize : Dimension

• setBackground : Color

Et bien d’autres !

Page 10: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JLABEL• Permet de définir un label• Peut comporter : une icône, du texte ou les deux

10

• Méthodes intéressantes : – setEnabled(boolean) : pour activer/désactiver la

zone (permet de griser le label)– setHorizontalAlignement(constante) pour contrôler

l’alignement du texte

Page 11: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

CRÉATION D’UN MENU• Pour créer un menu, il faut :

– Une barre de menu (JMenuBar),– Un menu (JMenu),– Des éléments dans ce menu (JMenuItem),

• Sur le JMenu, il est possible d’ajouter un Mnemonic– Permet d’accéder au menu directement en faisant : Alt+Char– Est associé à un caractère (setMnemonic(char))

11

• Sur les JMenuItem il est possible d’ajouter des accélérateurs : – Permet d’associer une combinaison du type Ctrl+Touche– setAccelerator(KeyStroke.getKeyStroke

( KeyEvent.LA_TOUCHE, ActionEvent.LE_MASQUE)

Page 12: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

ILLUSTRATION D’UN MENU

12

JMenuBar

JMenu

JMenuItem

Page 13: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

LES BORDURES• Il est possible d’attribuer une

bordure à un JComponent :setBorder(border)

• Pour obtenir la bordure, on utilise les méthodes statiques de la classe BorderFactory :Factory.createEtchedBorder()

13

Page 14: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Containers

14

COMMENT GROUPER LES COMPOSANTS D’IHM ?

Page 15: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Aperçu de Swing Les Containers

Les containers

– add / remove d’un Component– unicité de lieu– indice des components– association à un LayoutManager

Méthodes à connaître

• repaint() ! validate() ! : mise à jour de l’IHM• getBounds / setBounds(x,y, w, h) : positionne et dimensionne• getWidth() : largeur / getHeight() : hauteur• getX() et getY() : obtenir une coordonnée• setVisible(true / false)• getBackground et setBackground [objet Color, définition RGB]

Page 16: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

DES CONTAINERS RACINE• JFrame : le cadre principal d'une application. Il peut

contenir des menus et d'autres composants.

• JDialog : une fenêtre de dialogue avec l'utilisateur. Son « parent » (argument requis par ses créateurs) sert essentiellement à la placer dans l'écran.

• JApplet : classe de base pour les applets Java 2. Les applets sont des applications Java pouvant tourner à l'intérieur d'un navigateur Web. 16

Page 17: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

LES DIFFÉRENTS PANNEAUX D’UN JFRAME, JDIALOG, JAPPLET

• S’obtiennent par :– getRootPane () zone de la fenêtre sous le titre– getLayeredPane() zone où sont cachés les panneaux non

visibles– getContentPane () zone où les éléments sont ajoutés– getGlassPane () zone transparente dessinée au-dessus du

JRootPane utilisé pour afficher des pop-up menus17

Page 18: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JFRAME : ILLUSTRATION

18

JFrame frame = new JFrame("TopLevelDemo");

//Create the menu bar. Make it have a green background.JMenuBar greenMenuBar = new JMenuBar();greenMenuBar.setOpaque(true);greenMenuBar.setBackground(new Color(154, 165, 127));greenMenuBar.setPreferredSize(new Dimension(200, 20));

//Create a yellow label to put in the content pane.JLabel yellowLabel = new JLabel();yellowLabel.setOpaque(true);yellowLabel.setBackground(new Color(248, 213, 131));

//Set the menu bar and add the label to the content pane.frame.setJMenuBar(greenMenuBar);frame.getContentPane().add(yellowLabel);frame.setVisible(true);

Page 19: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JFRAME : ILLUSTRATION

19

Page 20: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

AUTRES MÉTHODES• setTitle (String) : pour mettre le titre de la

fenêtre• setSize (int width, int height)• setLocation (int x, int y) : pour déplacer la fenêtre• dispose () : pour fermer la fenêtre• pack () : ajuste chaque composant à sa taille

optimale et retaille la fenêtre

20

Page 21: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JFRAME : ILLUSTRATION

21

import javax.swing.*;public class TryWindow { public static void main (String[] args) { JFrame myWindow = new JFrame (''ceci est un titre'');

myWindow.setBounds (50, 100, 400, 150); // définit la position et la taille// détermine ce qu'il se passe lorsque l'on ferme la fenêtre

myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);myWindow.setVisible(true); // rend visible la fenêtre

}}

(0,0) X=50

Y= 100

H=150

W=400

DISPOSE_ON_CLOSE – contrainte par défaut - détruit le JFrame et ses composants mais ne termine pas l'application

DO_NOTHING_ON_CLOSE

HIDE_ON_CLOSE

Page 22: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JDIALOG : CLASSES et BOÎTES DE DIALOGUES

• Il existe différentes classes pour créer des boîtes de dialogue : – JOptionPane : pour créer des boîtes de dialogue

standards– JColorChooser : pour choisir une couleur– JFileChooser : pour permettre de sélectionner un

fichier– ProgressMonitor : pour afficher la progression

d’une opération22

Page 23: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JOPTIONPANE• Permet de créer des boîtes de dialogue standards• Permet de faire des avertissements• Possède des éléments standardisés :

– Réponse oui/non,– Icônes de danger, d’erreurs, …

• Est modifiable (boutons, icônes, …)

23

question

information

avertissement

erreur

Page 24: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JCOLORCHOOSER• Permet de créer une boîte de dialogue pour choisir une

couleur• Possède différents onglets correspond aux différents types

d’encodage de couleurs

24

Page 25: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JFILECHOOSER• Définit une boîte de dialogue pour sélectionner un

fichier• Deux boîtes de dialogue par défaut :

– Pour l’ouverture (showOpenDialog),– Pour la sauvegarde

(showSaveDialog)

25

Page 26: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

APPLET JAVA • S’exécute dans une machine virtuelle (celle du navigateur

web) et nécessite un fichier html• N’a pas de fonction main mais vit un cycle (run)• Les principales méthodes sont :

– init () : quand la page html est chargée la 1ère fois– start () : après init et chaque fois que l’on revient sur la

page– stop () : quand on quitte la page html (on interrompt les

méthodes lancées dans start)– destroy () : quand l’applet est terminée (on libère toutes les

ressources) 26

Page 27: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

EXEMPLE D’APPLET<HTML> <TITLE> Applet HelloWorldApplet

</TITLE> <APPLET

CODE=« HelloWorldApplet.class » WIDTH=200 HEIGHT=300><PARAM NAME=« Chaine » value =

« Hello World »></APPLET></HTML>

27

import java.awt.*;Import java.applet.*;

public class HelloWorldApplet extends Applet {

Font f = new Font ( « Serif », Font.BOLD, 36); public void paint (Graphics g) { g.setFont(f); g.setColor(Color.red); g.drawString(getParameter (« Chaine »), 10, 30); }}

Page 28: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

SÉCURITÉ ET APPLET

• Une applet ne peut pas charger de librairies ou utiliser des méthodes natives

• Elle ne peut normalement pas lire ou écrire dans des fichiers de l’hôte sur lequel elle s’exécute

• Elle ne peut pas effectuer de connexions réseaux sauf sur l’hôte dont elle provient

• Elle ne peut lancer aucun programme de l’hôte sur lequel elle s’exécute

28Ces restrictions peuvent être levées par un certificat de sécurité (cf. jarsigner, policytool)

Page 29: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

• Pour structurer les différents éléments graphiques, on utilise des containers qui font partis de la famille des panneaux.

• Quelques panneaux très utiles : – Le JPanel : panneau de base,– Le JScrollPane : qui permet d’obtenir des ascenseurs– Le JSplitPane : qui permet de diviser en 2 (seulement 2)– Le JTabbedPane : qui permet d’avoir différents onglets

pour les différents sous-contenus29

AUTRES CONTAINERSLa famille des panneaux

Page 30: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JPANEL• Le container le plus utilisé pour structurer

l’interface• Ne possède pas de réelles contraintes (la

gestion de l’organisation des éléments est déléguée à un Layout)

• Peut contenir des sous-panneaux

30

Page 31: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JSCROLLPANE• Permet d’obtenir des ascenseurs de manière automatique,• Est créé en lui associant le composant que l’on souhaite

pouvoir scroller• Le composant inclus dans le JScrollPane doit implémenter

l’interface Scrollable• Quelques éléments qui implémentent cette interface :

– JTextField,– JTextArea,– JTree,– JTable

31

Page 32: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JSPLITPANE• Permet de diviser en deux l’espace• Peut se construire avec les deux composants

contenus dans chacune des zones• Possède une orientation • (HORIZONTAL_SPLIT ou VERTICAL_SPLIT)

32

Page 33: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JTABBEDPANE• Permet d’avoir des onglets• Permet de mieux gérer l’espace de travail• Chaque onglet est créé avec son panel associé• L’onglet peut posséder une icône en plus ainsi qu’un

raccourci clavier (Mnemonic)• Peut-être fait de manière équivalente avec un

CardLayout (à ce moment, il n’y a pas d’onglet)

33

Page 34: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Afficheurs

34

COMMENT POSITIONNER LES COMPOSANTS ?

Page 35: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

DEUX MANIÈRES• Positionner de manière absolue, revient à :

– Retirer tout gestionnaire d’affichage (setLayout(null))– Placer un par un les éléments en leur donnant leur

position dans la fenêtre (méthode setBounds)– Du «sur mesure» mais peut s’avérer très complexe

à définir !

• Positionner de manière relative en utilisant des gestionnaires d’affichage

35

Page 36: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

MISE EN PAGE RELATIVE• La mise en page des éléments s’effectue à l’aide d’un

gestionnaire d’affichage (Layout),

• Tous les containers possèdent une méthode setLayout qui permet de spécifier le type de gestionnaire d’affichage

• On peut ajouter des contraintes lorsqu’on ajoute un composant

• Avantage : Le redimensionnement est géré automatiquement

36

Page 37: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Aperçu de SwingLayouts

Les Layout :Basé sur PreferredSize ou une maximisation de l’élément

• BorderLayout – par défaut dans une fenêtre– ajout en précisant la zone– add(comp, "North")

• FlowLayout : en ligne(s)• BoxLayout : séquence verticale ou horizontale• GridLayout : en tableau• GridBagLayout : avec des contraintes• CardLayout : empilement• etc.

Page 38: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

UTILISATION D’UN LAYOUT1. Création du layout Exemple : BorderLayout bl = new BorderLayout())

2. Association au container : panel.setLayout(bl)

3. Ajout de composants au container, avec ou sans contrainte

Exemple : panel.add(button, BorderLayout.EAST)

38

Page 39: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

BORDERLAYOUT• Définit des zones avec différentes proportions dans

lesquelles ajouter des éléments• La zone centrale s’agrandit proportionnellement au

container associé• Gestionnaire d’affichage par défaut des JFrame

39

NORTH

SOUTH CENTER

WESTEAST

Page 40: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

FLOWLAYOUT• On ajoute au fur et à mesure les composants, si cela

ne tient pas dans la ligne, on commence une nouvelle ligne

• Gestionnaire d’affichage par défaut des JPanel• Possibilité de spécifier l’alignement (centré par défaut)

setAlignement(int) – 0 gauche, 1 centré, 2 droite

40

Page 41: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Exempleimport javax.swing.*;

public class Exemple {public static void main(String[] args) {

JFrame fenetre = new JFrame();JPanel panel = new JPanel();

JLabel etiquette = new JLabel("Aujourd'hui: ");JCheckBox premier = new JCheckBox("Lundi");JCheckBox deuxieme = new JCheckBox("Mardi");JCheckBox troisieme = new JCheckBox("Mercredi");JCheckBox quatrieme = new JCheckBox("Jeudi");JCheckBox cinquieme = new JCheckBox("Vendredi", true);JCheckBox sixieme = new JCheckBox("Samedi");

Page 42: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

ExempleJCheckBox septieme = new JCheckBox("Dimanche");panel.add(etiquette);panel.add(premier); panel.add(deuxieme);panel.add(troisieme); panel.add(quatrieme);panel.add(cinquieme); panel.add(sixieme);panel.add(septieme);

fenetre.setContentPane(panel);fenetre.setTitle("Wesh mate mon flow!");fenetre.setBounds(100, 100, 200, 200);fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);fenetre.setVisible(true);

}}

Page 43: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Aperçu du résultatLe placement s’ajuste en fonction de la taille de la fenêtre :

Page 44: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

BOXLAYOUT• Définit une boîte dans laquelle seront ajoutés les

différents composants• Cette boîte peut-être :

– Horizontale : X_AXIS– Verticale : Y_AXIS

• On ajoute les éléments au fur et à mesure

44

Page 45: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

CARDLAYOUT• Permet d’empiler des composants (suivant des

panneaux)• Le dernier ajouté ou celui spécifié est visible• Concept de la pile de cartes

45

Page 46: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

GRIDLAYOUT• Définit une grille où ajouter les composants• L’ajout des composants se fait sans préciser de contraintes• On déclare le layout de la manière suivante :

– new GridLayout(0,2) // row, column 0 signifie autant qu’on veut

46

Page 47: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

GRIDBAGLAYOUT• Place les composants dans une grille modulaire en

définissant les contraintes des différents composants à placer

• Pour une mise en page complexe

47

Page 48: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

MISE EN PAGE COMPLEXEautre solution

• Combinaison de plusieurs panels avec leur propre layout

48

Page 49: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

Composants et partage de données

49

COMMENT GERER LA COHERENCE DE PLUSIEURS VUES ?

Page 50: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

LES JLIST ET LES JTABLE

• Permettent de représenter une collection de données• Il est possible de partager des données d’une JTable ou d’une

Jlist avec d’autres composants considérés comme d’autres vues de l’objet JTable ou JList

• Par exemple : une liste de noms affichée dans une JList. La JList est une vue (interactive) de la liste de noms permettant la sélection d’élément.

• Une représentation tabulaire de la même liste est une autre vue• Un texte qui indique le nombre d’éléments de la liste est une

autre vue du modèle 50

Page 51: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

ILLUSTRATION JLIST/JTABLE

51

JList JTable

Page 52: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JLIST• Possède différents constructeurs :

– Données fixes : JList (Vector listData) ou JList (Object[] listData)

– Données modifiables : JList (ListModel dm)

• Possède une méthode qui permet de spécifier le mode de sélection : setSelectionMode (int mode). mode peut valoir : – SINGLE_SELECTION– SINGLE_INTERVAL_SELECTION– MULTIPLE_INTERVAL_SELECTION

52

Page 53: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

LISTMODEL• Pour le modèle de données, utiliser la classe

DefaultListModel. Ce modèle stocke les objets sous forme de vecteur et fournit les méthodes suivantes : – addElement (Object),– boolean contains(Object), – boolean removeElement(Object)– Object get(index), Object remove(index), int size()

– Plus d’autres méthodes pour gérer les mises à jour des vues utilisants ces données (cf prochain cours)

53

Page 54: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JLIST• Exemple

54

String listData[]= {…,« Carlos »,…, « Ramier»};DefaultListModel model = new DefaultListModel();for (int i=0; i<listData.length; i++) model.addElement(listData[i]);

JList dataList = new JList(model);

JScrollPane listeScroll = new JScrollPane(dataList);

Page 55: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

JTABLE• Un constructeur possible de JTable :

– JTable (Object[][] rowData, Object[] columnNames)– On peut accéder au modèle sous-jacent avec la méthode :

• TableModel getModel()• Un autre constructeur avec directement le modèle :

55

String nomsCol[]={«Prenom», «Nom»};String rows[][] = { {«Dinah»,«Cohen»}, … ,

{«Said», «Kharrazen»}};DefaultTableModel model = new DefaultTableModel(rows, nomsCol);JTable table = new JTable(model);

Page 56: Vos premiers pas en Swing Partie structurelle Audrey Occello & AM Dery pinna@polytech.unice.fr

TABLEMODEL• Il existe 3 différents éléments pour créer un modèle de données :

– L’interface TableModel– La classe AbstractTableModel qui implémente TableModel– La classe DefaultTableModel

• DefaultTableModel est le plus simple à utiliser, quelques constructeurs associés : – DefaultTableModel(int row, int col)– DefaultTableModel(Object[][] data, Object[] columnNames)– DefaultTableModel(Vector data, Vector columnNames)

• Plus d’autres méthodes pour gérer les mises à jour des vues utilisant ces données (cf prochain cours)

56