Java Swing Composants de Swing o Java Beans
Java Swing Composants de Swing o Java. Beans o Actions o Boutons o Icônes o Bordures o Curseurs Jean Berstel - Institut Gaspard Monge, Université Marne-la- 1
Java Beans Java Swing Tout composant Swing est un Java. Bean. Un bean n est capable d’introspection n possède et gère des propriétés n expose les propriétés n communique par évènements les changements de propriétés n réalise la persistance car sait se sérialiser. Jean Berstel - Institut Gaspard Monge, Université Marne-la- 2
Propriétés n Java Swing Propriété l est exposée par set. XX(), get. XX(), is. XX() l est simple, liée (bound) ou contrainte n Propriété liée envoit un Property. Change. Event, chaque fois qu’elle change, aux Property. Change. Listener. n Propriété contrainte envoit un Property. Change. Event l l juste avant qu’elle ne change, et d’autres composants peuvent s’opposer (véto) au changement (Vetoable. Change. Listener). Jean Berstel - Institut Gaspard Monge, Université Marne-la- 3
Change. Event Java Swing n De plus, les composants Swing ont un événement “lèger”: Change. Event n’a que la méthode get. Source() (comme tout évènement). n Property. Change. Event a les méthodes l get. Source() l get. Old. Value() l get. New. Value() l get. Property. Name() Jean Berstel - Institut Gaspard Monge, Université Marne-la- 4
Abstract. Acti on n Abstract. Action est une classe abstraite l l l n elle implémente l’interface Action étend Action. Listener la seule méthode à écrire est action. Performed() Les conteneurs JMenu, JPopup. Menu et JTool. Bar honorent les actions: l l l n Java Swing un même objet d’une classe implémentant Abstract. Action peut être “ajouté” à plusieurs de ces conteneurs. les diverses instances opèrent de concert. par exemple, un objet ajouté à un menu et à une barre d’outils est activé ou désactivé simultanément dans les deux. Les classes dérivées de Abstract. Action sont utiles quand une même action peut être déclenchée de plusieurs manières. Jean Berstel - Institut Gaspard Monge, Université Marne-la- 5
Emploi d’Abstract. Action n Création d’une classe qui étend Abstract. Action n Utilisation comme Action. Listener n Utilisation dans un menu et dans une barre d’outils Java Swing class Mon. Action extends Abstract. Action { public void action. Performed( Action. Event e ) {. . . } } Action mon. Action = new Mon. Action(); JButton b = new JButton(“Hello”); b. add. Action. Listener(mon. Action); Action copy. Action = new Mon. Action(“Copy”); JMenu menu = new JMenu(“Edit”); JTool. Bar tools = new JTool. Bar(); JMenu. Item copy. Item = menu. add(copy. Action); JButton copy. Btn = tools. add(copy. Action); Jean Berstel - Institut Gaspard Monge, Université Marne-la- 6
Constructeurs et propriétés n Java Swing Avec une chaîne de caractères, et une icône Abstract. Action() Abstract. Action(String nom, Icon icône) n Propriété : enabled n Constantes n Gestion de propriétés: Action. DEFAULT // Action. NAME // set. Text() Action. SHORT_DESCRIPTION // set. Tool. Tip. Text Action. LONG_DESCRIPTION // aide contexte Action. SMALL_ICON // aussi set. Icon() void put. Value(String clé, Object valeur) Object get. Value(String clé) Jean Berstel - Institut Gaspard Monge, Université Marne-la- 7
Exempl e Java Swing public class My. Frame extends JFrame { private Action copy. Action, cut. Action, paste. Action; public My. Frame() {. . . JMenu. Bar mbar = new JMenu. Bar(); JTool. Bar toolbar = new JTool. Bar(); JMenu edit = new JMenu("Edit"); . . . copy. Action = new Mon. Action("Copy", new Image. Icon(”copy. gif")); } JMenu. Item copy = edit. add(copy. Action); copy. set. Icon(null); . . . JButton bouton = toolbar. add(copy. Action); bouton. set. Text(null); bouton. set. Tool. Tip. Text("copier"); class Mon. Action extends Abstract. Action {. . . String name; cut. Action. set. Enabled( false ); public Mon. Action(String name, Icon icon) { super( name, icon ); this. name = name; } public void action. Performed(Action. Event e) { System. out. println( name + " pressed" ); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la- 8
Etiquettes n Une étiquette peut contenir un texte, une icône, ou les deux. n Leurs positions sont fixées par des constantes. n Une étiquette peut être désactivée. n Constructeurs Java Swing JLabel(String libellé, Icon image, int align. Horizontal) l l n les paramètres peuvent être absents le dernier désigne le placement dans le conteneur Nombreuses fonctions utilitaires. Jean Berstel - Institut Gaspard Monge, Université Marne-la- 9
Etiquettes Java Swing public class Image. Label { public static void main(String[] args) { JLabel[] e = new JLabel[9]; e[0] = make. Label(JLabel. TOP, JLabel. LEFT); e[1] = make. Label(JLabel. TOP, JLabel. CENTER); e[2] = make. Label(JLabel. TOP, JLabel. RIGHT); e[3] = make. Label(JLabel. CENTER, JLabel. LEFT); e[4] = make. Label(JLabel. CENTER, JLabel. CENTER); e[5] = make. Label(JLabel. CENTER, JLabel. RIGHT); e[6] = make. Label(JLabel. BOTTOM, JLabel. LEFT); e[7] = make. Label(JLabel. BOTTOM, JLabel. CENTER); e[8] = make. Label(JLabel. BOTTOM, JLabel. RIGHT); e[0]. set. Enabled(false); e[2]. set. Icon. Text. Gap(15); protected static JLabel make. Label(int vert, int horiz) { JFrame f = new JFrame(); JLabel l = new JLabel("sourire", icon, f. add. Window. Listener(new. Swing. Constants. CENTER); Fermeur()); Container c = f. get. Content. Pane(); l. set. Vertical. Text. Position(vert); c. set. Layout(new Flow. Layout(Flow. Layout. LEFT, 5, l. set. Horizontal. Text. Position(horiz); 5)); l. set. Border(Border. Factory. create. Line. Border(Color. black)); for (int i = 0; i < 9; i++) l. set. Opaque(true); c. add(e[i]); l. set. Background(Color. yellow); f. set. Size(300, 250); return l; f. set. Visible(true); } c. set. Background(Color. blue); // opaque private static Icon icon = new Image. Icon("gifs/soccer. gif"); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la- 10
Boutons n Un bouton délivre un Action. Event quand on clique dessus, en plus des évènements de ses superclasses. n Un bouton et une étiquette sont des conteneurs. n Dans le programme ci-contre, l l Java Swing le fond est une image dans un JLabel le bouton “Hello” est ajouté à l’étiquette, vue comme conteneur le bouton est rendu transparent quand on passe sur le bouton, le curseur se change en main. Jean Berstel - Institut Gaspard Monge, Université Marne-la- 11
Exemple de l’image est chargée dans un JLabel bouton l’étiquette est centrée dans le conteneur Java Swing l l l’étiquette reçoit un Layout approprié et on y ajoute le bouton reçoit un Action. Listener un message s’affiche dans l’étiquette du bas public class Transparent. Button extends JFrame implements Action. Listener { JButton bouton = new JButton("Hello"); static String[] msg = {"Opaque", "Transparent avec foyer", "Transparent sans foyer ni bord", "Transparent sans fond"}; int state = 0; JLabel message = new JLabel(msg[state]); Transparent. Button() { super("Bouton transparent"); Container content. Pane = get. Content. Pane(); Icon image = new Image. Icon("gifs/mandrill. jpg"); JLabel label = new JLabel(image); content. Pane. add(label, Border. Layout. CENTER); content. Pane. add(message, Border. Layout. SOUTH); label. set. Layout(new Flow. Layout(Flow. Layout. LEFT)); label. add(bouton); bouton. set. Cursor(Cursor. get. Predefined. Cursor(Cursor. HAND_CURSOR)); bouton. set. Font(new Font("Helvetica", Font. BOLD, 40)); bouton. add. Action. Listener(this); } Jean Berstel - Institut Gaspard Monge, Université Marne-la- 12
Exemple de bouton (fin) Java Swing void action. Performed(Action. Event e) { switch (state) { case 0: bouton. set. Opaque(false); break; case 1: bouton. set. Focus. Painted(false); break; case 2: bouton. set. Border. Painted(false); break; case 3: bouton. set. Content. Area. Filled(false); break; case 4: bouton. set. Opaque(true); bouton. set. Focus. Painted(true); bouton. set. Border. Painted(true); bouton. set. Content. Area. Filled(true); break; } state = (state +1) % msg. length; message. set. Text(msg[state]); System. out. println(state + " Aille!"); } public static void main(String[] args) { Transparent. Button f = new Transparent. Button(); f. pack(); f. set. Visible(true); f. add. Window. Listener(new Fermeur()); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la- 13
Java Swing Icônes n La classe Image. Icon implémente l’interface Icon n Le chargement de l’image de l’icône se fait au moyen d’un Media. Tracker, mais ceci est transparent à l’utilisateur. n Constructeurs Image. Icon(String nomfichier) Image. Icon(Image image) Image. Icon(URL url) n Methodes int get. Icon. Height() int get. Icon. Width() Image get. Image() Jean Berstel - Institut Gaspard Monge, Université Marne-la- 14
Bordures n Peut être associé à tout composant dérivant de JComponent n Figurent dans javax. swing. border n Tout bord étend Abstract. Border qui implémente Border n La classe Border. Factory a des méthodes statiques de création qui de plus essaient d’utiliser des bords déjà construits. Elle est dans javax. swing Jean Berstel - Institut Gaspard Monge, Université Marne-la- Java Swing 15
Les divers bords Java Swing public class Bords extends JPanel { static JPanel panel. Bord(Border b) {. . . } public Bords(){ set. Layout(new Grid. Layout(4, 2)); add(panel. Bord(new Titled. Border("Titre"))); add(panel. Bord(new Etched. Border())); add(panel. Bord(new Matte. Border(5, 30, 10, 30, Color. green))); add(panel. Bord(new Line. Border(Color. blue))); add(panel. Bord(new Bevel. Border(Bevel. Border. RAISED))); add(panel. Bord(new Soft. Bevel. Border(Bevel. Border. LOWERED))); add(panel. Bord(new Compound. Border(new Etched. Border(), new Line. Border(Color. red)))); . . . } n Les classes de bords ont des noms différents. n Les paramètres dépendent des classes n On peut imbriquer un bord dans un autre en créant un bord composé. Jean Berstel - Institut Gaspard Monge, Université Marne-la- 16
Les noms des classes n Java Swing Par introspection, on obtient le nom de la classe static JPanel panel. Bord(Border b) { JPanel p = new JPanel(); p. set. Layout(new Border. Layout()); String nom = b. get. Class(). to. String(); p. add(new JLabel(nom, JLabel. CENTER), Border. Layout. CENTER); p. set. Border(b); return p; } Jean Berstel - Institut Gaspard Monge, Université Marne-la- 17
Un bord compliqué Java Swing JPanel p = new JPanel(); p. set. Layout(new Border. Layout()); p. add(new JLabel("bords imbriqués", JLabel. CENTER), Border. Layout. CENTER); Border empty. Border = new Empty. Border(3, 3, 3, 4); Border b = new Compound. Border(empty. Border, new Line. Border(Color. blue, 3) ); b = new Compound. Border(new Line. Border(Color. red, 3), b); b = new Compound. Border(empty. Border, b); b = new Compound. Border(new Line. Border(Color. green, 3), b); b = new Compound. Border(empty. Border, b); p. set. Border(b); Jean Berstel - Institut Gaspard Monge, Université Marne-la- 18
Curseur n Un curseur (slider) permet d’entrer une valeur entre deux bornes selon uen échelle linéaire. n On construit un curseur par Java Swing JSlider curseur = new JSlider(min, max, valeur. Initiale); n si les valeurs extrêmes ne sont pas données, elles prennent les valeurs par défaut 0, 100, et 50 pour la valeur initiale. n Un curseur vertical est construit avec JSlider curseur = new JSlider(JSlider. VERTICAL, min, max, valeur. Initiale); Jean Berstel - Institut Gaspard Monge, Université Marne-la- 19
Curseurs n A chaque changement de valeur, un curseur engendre un Change. Event n On écoute ces évènements en enrégistrant un Change. Listener. n Sa seule méthode est state. Changed(). Java Swing public void state. Changed(Change. Event ev) { JSlider curseur = (JSlider)ev. get. Source(); int valeur = curseur. get. Value(); . . . Jean Berstel - Institut Gaspard Monge, Université Marne-la- 20
Java Swing Curseurs : décorations n Marques d’espacement: n Affichage de ces marques: curseur. set. Paint. Ticks(true); n Arrêt sur graduation: curseur. set. Snap. To. Ticks(true); n Libellés des graduations: curseur. set. Paint. Labels(true); n Inversion de direction: curseur. set. Inverted(true); Jean Berstel - Institut Gaspard Monge, Université Marne-la- curseur. set. Major. Tick. Spacing(20); curseur. set. Minor. Tick. Spacing(5); 21
Curseurs: étiquettes personnalisées n Java Swing Les étiquettes sont des JLabel, rangées dans une table de hachage avec les valeurs de marques correspondantes, transformées en objets: label. Table = new Hashtable(); label. Table. put(new Integer(0), new JLabel(new Image. Icon("9 h. gif"))); label. Table. put(new Integer(20), new JLabel(new Image. Icon("10 h. gif"))); label. Table. put(new Integer(40), new JLabel(new Image. Icon("jh. gif"))); n La table est enregistrée dans le curseur. set. Label. Table(label. Table); Jean Berstel - Institut Gaspard Monge, Université Marne-la- 22
Exemple n Trois curseurs permettent de sélectionner et d’afficher une date. n Le curseur des jours ajuste son maximum en fonction du nombre de jours dans le mois. Jean Berstel - Institut Gaspard Monge, Université Marne-la- Java Swing 23
Java Swing Curseur des années n De 1990 à 2010 n initialisé à l’année courante n encadré et titré Calendar calendar = new Gregorian. Calendar(); Date date = new Date(); calendar. set. Time(date); cur. Annee = new JSlider(1990, 2010, calendar. get(Calendar. YEAR)); cur. Annee. set. Paint. Labels(true); cur. Annee. set. Major. Tick. Spacing(5); cur. Annee. set. Minor. Tick. Spacing(1); cur. Annee. set. Paint. Ticks(true); cur. Annee. add. Change. Listener(lst); p = new JPanel(new Border. Layout()); p. set. Border(new Titled. Border(new Etched. Border(), " Année ")); p. add(cur. Annee, Border. Layout. CENTER); Jean Berstel - Institut Gaspard Monge, Université Marne-la- 24
Curseur des mois n les étiquettes sont des abréviations des noms des mois n elles sont rangées dans une table de hachage Java Swing cur. Mois = new JSlider( 0, 11, calendar. get(Calendar. MONTH)); String[] months = (new Date. Format. Symbols()). get. Short. Months(); Hashtable labels = new Hashtable(12); for (int k = 0; k < 12; k++) labels. put(new Integer(k), new JLabel(months[k])); cur. Mois. set. Label. Table(labels); cur. Mois. set. Paint. Labels(true); cur. Mois. set. Minor. Tick. Spacing(1); cur. Mois. set. Paint. Ticks(true); cur. Mois. add. Change. Listener(lst); Jean Berstel - Institut Gaspard Monge, Université Marne-la- 25
Curseur des jours n Initialisé au nombre de jours du mois courant n Numérotation à partir de 1 Java Swing int max. Days = calendar. get. Actual. Maximum(Calendar. DAY_OF_MONTH); cur. Jour = new JSlider(1, max. Days, calendar. get(Calendar. DAY_OF_MONTH)); cur. Jour. set. Paint. Labels(true); cur. Jour. set. Major. Tick. Spacing(5); cur. Jour. set. Minor. Tick. Spacing(1); cur. Jour. set. Paint. Ticks(true); cur. Jour. add. Change. Listener(lst); Jean Berstel - Institut Gaspard Monge, Université Marne-la- 26
Java Swing Ajuster la n En réponse à un Change. Event date de l’un des trois curseurs l l l recalculer la date ajuster l’échelle des jours dans le curseur des jours afficher la date dans la zone de date. lst = new Date. Listener(); class Date. Listener implements Change. Listener { public void state. Changed(Change. Event e) { show. Date(); } } public void show. Date() { calendar. set(cur. Annee. get. Value(), cur. Mois. get. Value(), 1); int max. Days = calendar. get. Actual. Maximum(Calendar. DAY_OF_MONTH); if (cur. Jour. get. Maximum() != max. Days) cur. Jour. set. Maximum(max. Days); calendar. set(cur. Annee. get. Value(), cur. Mois. get. Value(), cur. Jour. get. Value()); Date date = calendar. get. Time(); zone. Date. set. Text(date. Format. format(date)); } Jean Berstel - Institut Gaspard Monge, Université Marne-la- 27
- Slides: 27