Cours 6 Clones swing Exemple class Integer Stack

![Exemple class Integer. Stack implements Cloneable{ private int[] buffer; private int sommet; public Integer. Exemple class Integer. Stack implements Cloneable{ private int[] buffer; private int sommet; public Integer.](https://slidetodoc.com/presentation_image_h2/3aec7f38895daeaa4f78a8d5c2ee0451/image-2.jpg)












![Et le main public class Top. Level {//afficher. Ma. Fenetre() public static void main(String[] Et le main public class Top. Level {//afficher. Ma. Fenetre() public static void main(String[]](https://slidetodoc.com/presentation_image_h2/3aec7f38895daeaa4f78a8d5c2ee0451/image-15.jpg)













![Le main public static void main(String[] args) { new Graphe. Swing(un. Graphe()); } public Le main public static void main(String[] args) { new Graphe. Swing(un. Graphe()); } public](https://slidetodoc.com/presentation_image_h2/3aec7f38895daeaa4f78a8d5c2ee0451/image-29.jpg)











- Slides: 40
Cours 6 Clones swing
Exemple class Integer. Stack implements Cloneable{ private int[] buffer; private int sommet; public Integer. Stack(int max){ buffer=new int[max]; sommet=-1; } public void empiler(int v){ buffer[++sommet]=v; } public int dépiler(){ return buffer[sommet--]; } public Integer. Stack clone(){ try{ return (Integer. Stack)super. clone(); }catch(Clone. Not. Supported. Exception e){ throw new Internal. Error(e. to. String()); } } } POO-L 3 H. Fauconnier 2
Problème: Integer. Stack un=new Integer. Stack(10); un. empiler(3); un. empiler(9) Ineteger. Stack deux=un. clone(); Les deux piles partagent les mêmes données… POO-L 3 H. Fauconnier 3
Solution… public Integer. Stack clone(){ try{ Integer. Stack n. Obj = (Integer. Stack)super. clone(); n. Obj. buffer=buffer. clone(); return n. Obj; }catch(Clone. Not. Supported. Exception e){ //impossible throw new Internal. Error(e. to. String()); } } POO-L 3 H. Fauconnier 4
Copie profonde public class Copie. Profonde implements Cloneable{ int val; Copie. Profonde n=null; public Copie. Profonde(int i) { val=i; } public Copie. Profonde(int i, Copie. Profonde n){ this. val=i; this. n=n; } public Object clone(){ Copie. Profonde tmp=null; try{ tmp=(Copie. Profonde)super. clone(); if(tmp. n!=null) tmp. n=(Copie. Profonde)(tmp. n). clone(); }catch(Clone. Not. Supported. Exception ex){} return tmp; } } POO-L 3 H. Fauconnier 5
Suite class essai{ static void affiche(Copie. Profonde l){ while(l!=null){ System. out. println(l. val+" "); l=l. n; } } public static void main(String[] st){ Copie. Profonde l=new Copie. Profonde(0); Copie. Profonde tmp; for(int i=0; i<10; i++){ tmp=new Copie. Profonde(i, l); l=tmp; } affiche(l); Copie. Profonde n=(Copie. Profonde)l. clone(); affiche(n); } } POO-L 3 H. Fauconnier 6
Java Swing
Principes de base o Des composants graphiques (exemple: JFrame, JButton …) o o Hiérarchie de classes Des événements et les actions à effectuer (exemple presser un bouton) o (Et d'autres choses…)
Principes o o o Définir les composants (instance de classes) Les placer « à la main » (layout Manager) dans un JPanel ou un content pane ou en utilisant des outils comme eclipse ou netbeans Définir les actions associées aux événements (Listener) et les associer aux composants graphiques
Principes o o o Dans une interface graphique, le programme réagit aux interactions avec l'utilisateur Les interactions génèrent des événements Le programme est dirigé par les événements (event-driven)
Afficher… o Pour pouvoir être affiché, il faut que le composant soit dans un top-level conteneur: (JFrame, JDialog et JApplet) o Hiérarchie des composants: arbre racine top-level
Exemple o Correspond à la hiérarchie
Le code import java. awt. *; import javax. swing. *; public class Top. Level { /** * Affiche une fenêtre JFrame top level * avec une barre de menu JMenu. Bar verte * et un JLabel jaune */ private static void afficher. Ma. Fenetre() { //créer la Jframe //créer la JMenu. Bar //créer le Jlabel // mettre le JMenu. Bar et le Jlable dans la Jframe //afficher la Jframe } }
Le code //Creer la JFrame frame = new JFrame("Top. Level. Demo"); frame. set. Default. Close. Operation(JFrame. EXIT_ON_CLOSE); //Créer la JMenu. Bar green. Menu. Bar = new JMenu. Bar(); green. Menu. Bar. set. Opaque(true); green. Menu. Bar. set. Background(new Color(0, 200, 0)); green. Menu. Bar. set. Preferred. Size(new Dimension(200, 20)); //Créer le JLabel yellow. Label = new JLabel(); yellow. Label. set. Opaque(true); yellow. Label. set. Background(new Color(250, 0)); yellow. Label. set. Preferred. Size(new Dimension(200, 180)); //mettre la Jmenu. Bar et position le JLabel frame. set. JMenu. Bar(green. Menu. Bar); frame. get. Content. Pane(). add(yellow. Label, Border. Layout. CENTER); //afficher. . . frame. pack(); frame. set. Visible(true);
Et le main public class Top. Level {//afficher. Ma. Fenetre() public static void main(String[] args) { javax. swing. Swing. Utilities. invoke. Later(new Runnable() { public void run() { afficher. Ma. Fenetre(); } }
Evénements: principes o Dans un système d'interface graphique: n n Quand l'utilisateur presse un bouton, un "événement" est posté et va dans une boucle d'événements Les événements dans la boucle d'événements sont transmis aux applications qui se sont enregistrées pour écouter.
Evénements o Chaque composant génère des événements: n Presser un JButton génère un Action. Event (système d'interface graphique) o n Un event listener (implémente Action. Listener) o o n Cet Action. Event contient des infos (quel bouton, position de la souris, modificateurs…) définit une méthode action. Performed S'enregistre auprès du bouton add. Action. Listener Quand le bouton est "clické", l'action. Performed sera exécuté (avec l'Action. Event comme paramètre)
Exemples Buttons
Un exemple o Un bouton qui réagit
Le code: o o o Un JButton Un JLabel Implementer Action. Listener n o action. Perfomed définit ce qui se passe quand le bouton est cliqué Placer le bouton et le label
Code: import java. awt. *; import javax. swing. JFrame; import javax. swing. JPanel; import javax. swing. JButton; import javax. swing. Jcomponent; import java. awt. Toolkit; import java. awt. Border. Layout; import java. awt. event. Action. Listener; import java. awt. event. Action. Event; import javax. swing. JLabel; public class Un. Bouton extends Jpanel implements Action. Listener { JButton bouton; String contenu="Rien Reçu"; JLabel label=new JLabel(contenu); int cmp=0; public Un. Bouton() { //…} public void action. Performed(Action. Event e) {//…} private static void ma. Fenetre(){//…} public static void main(String[] args) {//…} }
Code public Un. Bouton() { super(new Border. Layout()); bouton = new JButton("Click"); bouton. set. Preferred. Size(new Dimension(200, 80)); add(bouton, Border. Layout. NORTH); label = new JLabel(contenu); label. set. Preferred. Size(new Dimension(200, 80)); add(label, Border. Layout. SOUTH); bouton. add. Action. Listener(this); } public void action. Performed(Action. Event e) { Toolkit. get. Default. Toolkit(). beep(); label. set. Text("clické "+ (++cmp)+ " fois"); }
Code private static void ma. Fenetre() { JFrame frame = new JFrame("Un. Bouton"); frame. set. Default. Close. Operation(JFrame. EXIT_ON_CLOSE); JComponent new. Content. Pane = new Un. Bouton(); new. Content. Pane. set. Opaque(true); frame. set. Content. Pane(new. Content. Pane); frame. pack(); frame. set. Visible(true); } public static void main(String[] args) { //Formule magique javax. swing. Swing. Utilities. invoke. Later(new Runnable() { public void run() { ma. Fenetre(); } }); }
Variante public class Un. Bouton. Bis extends JPanel { //… bouton. add. Action. Listener(new Action. Listener() { public void action. Performed(Action. Event e) { Toolkit. get. Default. Toolkit(). beep(); label. set. Text("clické " + (++cmp) + " fois"); } }); } //… }
Hiérarchie des classes… POO-L 3 H. Fauconnier 25
POO-L 3 H. Fauconnier 26
Un exemple o Un traceur de fonctions n Une interface graphique swing
Organisation o Graphe. Swing met en place les composants swing contient un Graphe. Panel extension de Jpanel n Graphe. Panel méthode paint. Component qui affiche le graphe de la fonction o o Graphe est la classe contenant le graphe et définissant une méthode draw pour l'affichage Cette méthode appelle tracer de la classe abstraite Traceur n Fonction. Traceur étend Traceur POO-L 3 H. Fauconnier 28
Le main public static void main(String[] args) { new Graphe. Swing(un. Graphe()); } public static Graphe un. Graphe() { Plot. Settings p = new Plot. Settings(-2, 2, -1, 1); p. set. Plot. Color(Color. RED); p. set. Grid. Spacing. X(0. 5); p. set. Grid. Spacing. Y(0. 5); p. set. Title("Une parabole et une sinusoide"); Graphe graphe = new Graphe(p); graphe. functions. add(new Parabole()); graphe. functions. add(new Fonction. Traceur() { public double get. Y(double x) { return Math. sin(x); } public String get. Name() { return "Sin(x)"; } }); return graphe; } POO-L 3 H. Fauconnier 29
Composants o Modèle Vue Contrôleur
Préliminaires… o Lightweight et heavyweight composants n Dépendent ou non du système d’interface graphique o o n Lightweight écrit en Java et dessiné dans un heavyweight composant- indépendant de la plateforme Les heavyweight composants s’adressent directement à l’interface graphique du système (certaines caractéristiques dépendent du « look and feel » ).
Look and feel o Look and feel: Possibilité de choisir l’apparence de l’interface graphique. UIManager gère l’apparence de l’interface
Multithreading o Attention au « modèle, contrôleur, vue » en cas de multithreading: n n Tous les événements de dessin de l’interface graphiques sont dans une unique file d’event-dispatching dans une seule thread. La mise à jour du modèle doit se faire tout de suite après l’événement de visualisation dans cette thread.
Plus précisément o o o Swing prend en charge la gestion des composants qui sont dessinés en code Java (lightweight) Les composants AWT sont eux liés aux composants natifs (heavyweight) Swing dessine les composants dans un canevas AWT et utilise le traitement des événements de AWT
Suite Les threads o Main application thread o Toolkit thread o Event dispatcher thread o Toutes Les opérations d'affichage ont lieu dans une seule thread l'EDT
Principes o o Une tâche longue ne doit pas être exécutée dans l'EDT Un composant Swing doit s'exécuter dans l'EDT
Exemple public void action. Performed(Action. Event e){ try { Thread. sleep(4000); } catch (Interrupted. Exception e) { } } Provoque une interruption de l'affichage pendant 4 secondes
Une solution public void action. Performed(Action. Event e){ try{ Swing. Utilities. invoke. Later(new. Runnable( { public void run() { //opération longue } }); } catch (Interrupted. Exception ie) {} catch (Invocation. Target. Exception ite) {} } }
Le main o Normalement la création d'une fenêtre ne devrait avoir lieu que dans l'EDT: public static void main(String[] args) { //Formule magique javax. swing. Swing. Utilities. invoke. Later(new Runnable() { public void run() {ma. Fenetre(); } }); } invoke. Later crée une nouvelle thread qui poste la thread crée dans l'EDT
Attendre le résultat: try { Swing. Utilities. invoke. And. Wait(new Runnable() { public void run() { show(); } }); } catch (Interrupted. Exception ie) { } catch (Invocation. Target. Exception ite) { }