Java Swing Un diteur de texte o Objectifs

Java Swing Un éditeur de texte o Objectifs o Menu. Manager o Cahier des charges o Fichiers o Textes et documents o Etat du document o Vue d’ensemble o Menus o Actions o Barre d’outils o Undo. Handler Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 1

Objectifs n Présenter des interactions d’un composant de texte avec son environnement l l l n Ouverture et sauvegarde des fichiers Couper-coller Undo-Redo L’important est la cohérence de l’environnement l l n Java Swing Entrées des menus activables seulement si cela a un sens “Aide implicite” que cela apporte En revanche, on ignore le style du texte lui-même l l Style des paragraphes Polices de caractères Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 2

Cahier de charges n Editeur SDI (single document interface) l l n nouveau, ouvrir, sauver sous Commandes de manipulation du texte l l n une seule fenêtre, plusieurs documents plusieurs fenêtres, une par document Commandes de manipulation de documents l n un seul document présent une seule fenêtre de manipulation du texte Autres modèles l l n Java Swing copier - couper, coller, tout sélectionner annuler - rétablir Présentation de ces commandes sous forme l menu - toolbar - raccourcis clavier Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 3

Textes et documents n Classes de textes n Classes de documents Java Swing . . . | +--javax. swing. JComponent | +--javax. swing. text. JText. Component | +--javax. swing. JText. Area | +--javax. swing. JText. Field | +--javax. swing. JEditor. Pane | +--javax. swing. JText. Pane java. lang. Object | +--javax. swing. text. Abstract. Document implements Document | | +--javax. swing. text. Plain. Document | extends | | +--javax. swing. text. Default. Styled. Document implements Styled. Document | +--javax. swing. text. html. HTMLDocument Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 4

Document / vue n Un composant de texte présente une vue d’un document. l l n Java Swing Text. Area et Text. Field associés au Plain. Document Text. Pane associé à Styled. Document Correspondance JText. Area editor; Document document = editor. get. Document(); editor. set. Document(new Plain. Document()); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 5

Ecouter le texte n Java Swing Via le document, insertion, suppression, remplacement Document document = editor. get. Document(); document. add. Document. Listener( un listener ); n Un Document. Listener implémente trois méthodes public void changed. Update (Document. Event e); public void insert. Update (Document. Event e); public void remove. Update (Document. Event e); appelées après modification d’un attribut, insertion, suppression. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 6

Java Swing Sélection n On peut pister les déplacements du point d’insertion (caret) Caret caret = editor. get. Caret(); caret. add. Caret. Listener( un Caret. Listener ); par un Caret. Listener n Un Caret. Listener possède une méthode caret. Update appelée chaque fois que le point d’insertion bouge n un Caret. Event fournit deux méthodes l l n get. Dot() qui donne le point actuel get. Mark() qui donne le point précédent public void caret. Update(Caret. Event e) { int now = e. get. Dot(); int before = e. get. Mark(); boolean now. Selected = now != before; . . . } Un mouvement de souris, avec bouton enfoncé, l ne provoque pas d’évènement, l mais provoque un évènement quand on relâche Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée le bouton 7

Manipulations de textes n Java Swing Manipulations de texte prédéfinies (sont en fait des méthodes de JText. Component): void editor. cut(); editor. copy(); editor. paste(); editor. select. All(); les dernières transfèrent dans le presse-papier système. Clipboard clip = Toolkit. get. Default. Toolkit(). get. System. Clipboard(); n Le Default. Editor. Kit prédéfinit une trentaine d’actions sur les composants de textes. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 8

Vue d’ensemble n Le texte l l n chaque action (Action) (nouveau, . . . , tout sélectionner) est implémentée dans une classe séparée Les menus et la barre d’outils l n une seule zone de texte (JText. Area) le document associé ne change pas, sauf pour la commande “nouveau”. Les actions l n Java Swing construits à partir des actions Les gestionnaires de cohérence l l l de la cohérence des menu : une Edit. Menu. Manager de la cohérence des undo-redo : un Undo. Handler de sauvegarde de documents modifiés : une Status. Bar. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 9

Composants n Java Swing Composants de la vue JText. Component editor; JMenu. Bar menubar; JTool. Bar toolbar; Status. Bar status; n Composants de la gestion File current. File = null; JFile. Chooser selecteur. Fichier; Undo. Handler undo. Handler; Edit. Menu. Manager edit. Menu. Manager; Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 10

Les actions n Java Swing Une action par. . . action Action Action Action undo. Action = new Undo. Action(); redo. Action = new Redo. Action(); new. Action = new New. Action(); open. Action = new Open. Action(); save. Action = new Save. Action(); save. As. Action = new Save. As. Action(); exit. Action = new Exit. Action(); cut. Action = new Cut. Action(); copy. Action = new Copy. Action(); paste. Action = new Paste. Action(); select. All. Action = new Select. All. Action(); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 11

Undo. Action n Java Swing Premier exemple : undo. Action class Undo. Action extends Abstract. Action { public Undo. Action() { super("Undo", new Image. Icon("gifs/undo. gif")); set. Enabled(false); } public void action. Performed(Action. Event e) { try { undo. Handler. undo(); } catch (Cannot. Undo. Exception ex) {} undo. Handler. update(); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 12

Undo. Handler n Java Swing Il gère les undo, mais aussi l’état des boutons ! class Undo. Handler extends Undo. Manager { public void undoable. Edit. Happened(Undoable. Edit. Event e) { super. add. Edit(e. get. Edit()); // le “super” inutile update(); // en plus } public void update() { undo. Action. set. Enabled(can. Undo()); redo. Action. set. Enabled(can. Redo()); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 13

Cut. Action n Java Swing Couper implique l l mettre dans la corbeille mettre à jour les boutons class Cut. Action extends Abstract. Action { Cut. Action() { super("Cut", new Image. Icon("gifs/cut. gif")); } public void action. Performed(Action. Event e) { get. Editor(). cut(); // texte edit. Menu. Manager. do. Cut(); //boutons } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 14

Edit. Menu. Manag er n Java Swing Il gère l l les transitions entre les 4 états du menu la mise-à-jour de la vue (menu et toolbar) par la fonction update() class Edit. Menu. Manager implements Caret. Listener { int state; static final int EMPTY = 0, CUTCOPY = 1, PASTE = 2, FULL = 3; void void do. Initial() {. . . } do. Copy() {. . . } do. Cut() {. . . } do. Paste() {. . . } do. Selected() {. . . } do. Deselected() {. . . } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 15

Edit. Menu. Manager (suite) n Java Swing Après une sélection : void do. Selected() { if (state == EMPTY) state = CUTCOPY; else if (state == PASTE) state = FULL; update. Enables(state); } n Après un copy : void do. Copy() { if (state == CUTCOPY) { state = FULL; update. Enables(state); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 16

Edit. Menu. Manager (suite) n Java Swing C’est aussi un Caret. Listener, pour écouter les sélections public void caret. Update(Caret. Event e) { int now = e. get. Dot(); int before = e. get. Mark(); boolean now. Selected = now != before; if (now. Selected) do. Selected(); else do. Deselected(); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 17

Edit. Menu. Manager (fin) n La mise-à-jour des boutons est paresseuse Java Swing public void update. Enables(int state) { switch (state) { case EMPTY : cut. Action. set. Enabled(false); copy. Action. set. Enabled(false); paste. Action. set. Enabled(false); break; case CUTCOPY: cut. Action. set. Enabled(true); copy. Action. set. Enabled(true); paste. Action. set. Enabled(false); break; case PASTE: . . . case FULL: . . . } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 18

Ouvrir un fichier n Il faut l l n Java Swing s’assurer que le fichier courant n’est pas modifié s’il est modifié, demander une éventuelle sauvegarde ouvrir un dialogue de choix de fichier lire ce fichier Ces opérations sont assumées par la méthode action. Performed() class Open. Action extends Abstract. Action { Open. Action() { super("Ouvrir. . . ", new Image. Icon("gifs/open. gif")); } public void action. Performed(Action. Event e) {. . . } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 19

Ouvrir un fichier (suite) Java Swing public void action. Performed(Action. Event e) { if (!is. Confirmed( "Voulez vous sauver le texte courantn"+ " avant d'ouvrir un autre fichier ? ", "Sauver avant d'ouvrir ? ")) return; int answer = selecteur. Fichier. show. Open. Dialog(frame); if (answer != JFile. Chooser. APPROVE_OPTION) return; current. File = selecteur. Fichier. get. Selected. File(); try { File. Reader in = new File. Reader(current. File); get. Editor(). read(in, null); in. close(); } catch (IOException ex) { ex. print. Stack. Trace(); } status. set. Saved(); frame. set. Title(current. File. get. Name()); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 20

Ouvrir un fichier (fin) Java Swing boolean is. Confirmed(String question, String titre) { if (!status. is. Modified()) return true; int reponse = JOption. Pane. show. Confirm. Dialog(null, question, titre, JOption. Pane. YES_NO_CANCEL_OPTION); switch(reponse) { case JOption. Pane. YES_OPTION: { save. Action. action. Performed(null); return !status. is. Modified(); } case JOption. Pane. NO_OPTION: return true; case JOption. Pane. CANCEL_OPTION: return false; } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 21

Etat du document n Il n’existe pas de fonction qui indique une modification du document n Status. Bar assume ce rôle. . . Java Swing class Status. Bar extends JPanel implements Document. Listener { boolean mod. Status = false; // true = modified; public boolean is. Modified() { return mod. Status; } public void changed. Update(Document. Event ev) { set. Modified(); } public void insert. Update(Document. Event ev) { set. Modified(); } public void remove. Update(Document. Event ev) { set. Modified(); } public void set. Saved() { mod. Status = false; get. Editor(). get. Document(). add. Document. Listener(this); save. Action. set. Enabled(false); } public void set. Modified() { mod. Status = true; get. Editor(). get. Document(). remove. Document. Listener(this); save. Action. set. Enabled(true); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 22

Les menus n Java Swing Dans le menu “Fichier”, on ajoute des raccourcis protected JMenu. Bar create. Menubar() { JMenu. Bar mb = new JMenu. Bar(); JMenu menu; JMenu. Item item; menu = new JMenu("Fichier"); item = menu. add(new. Action); item. set. Icon(null); item. set. Mnemonic('N'); item = menu. add(open. Action); item. set. Icon(null); item. set. Mnemonic('O'); . . . menu. add. Separator(); item = menu. add(exit. Action); mb. add(menu); . . . return mb; } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 23

La barre d’outils n Java Swing On ajoute les tooltips, des espaces et de la glue private JTool. Bar create. Toolbar() { JButton b; JTool. Bar tb = new JTool. Bar(); b = tb. add(new. Action); b. set. Text(null); b. set. Tool. Tip. Text("nouveau"); . . . tb. add(Box. create. Horizontal. Strut(10)); b = tb. add(copy. Action); b. set. Text(null); b. set. Tool. Tip. Text("copier"); . . . tb. add(Box. create. Horizontal. Glue()); return tb; } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 24
- Slides: 24