Interface graphique avec Java S. RITAL
Plan Ma première fenêtre Animation Les boutons Multi-threading Menu, Barre d'outils, Le Pattern MVC Les interfaces Observer / Observable Calculatrice
Les boîtes à outils graphiques Java propose deux boîtes à outils graphiques : AWT (Abstract Window Toolkit) depuis la version 1.0 Dépend d'os Lourde SWING depuis la version 1.2 Ne dépend pas d'os Légére
Swing Container Object JComponent Component Swing est une extension des AWT nombreux nouveaux composants nombreuses facilités séparation entre modèle (données) aspect visuel (UI) contrôle Les composants sont légers, sauf JApplet, JWindow, JFrame, JDialog Container AbstractButton JComponent JToggleButton Panel JCheckBox Applet JRadioButton JButton JApplet JMenuButton Window JWindow JMenu Frame JRadioButtonMenuItem JCheckButtonMenuItem JFrame Dialog JColorChooser JComboBox JDialog JInternalFrame JLabel JList JMenuBar JOptionPane JPanel JPopupMenu JProgressBar...
Ma première fenêtre JFrame JPanel Graphics & Graphics 2D
Ma première fenêtre
Ma première fenêtre
Ma première fenêtre
JFrame JFrame Une JFrame contient une fille unique, de la classe JRootPane JRootPane Cette fille contient deux filles, glasspane (JPanel) et glasspane layeredpane layeredpane (JLayeredPane) La layeredpane a deux filles, contentpane menubar contentpane (JPanel) et menubar (null JMenuBar) class Tout extends JFrame { On travaille dans contentpane. Tout() { JPanel panel; JApplet, JWindow et JDialog sont getcontentpane().add(panel); semblables.... }... }
Objet JFrame JFrame RootPane conteneur principal qui contient les autres composants ; le LayeredPane (en violet), qui forme juste un panneau composé du conteneur global et de la barre de menu (MenuBar ); La menubar (orange) le content pane (en rose) : c'est dans celui-ci que nous placerons nos composants ; le GlassPane (en transparence), couche utilisée pour intercepter les actions de l'utilisateur avant qu'elles ne parviennent aux composants. Il existe d'autres types de fenêtre : la JWindow, une JFrame sans bordure et non draggable (déplaçable), et la JDialog, une fenêtre non redimensionnable.
Look and fel Trois look and feel existent, de noms "com.sun.java.swing.plaf.windows.windowslookandfeel" "com.sun.java.swing.plaf.motif.motiflookandfeel" "javax.swing.plaf.metal.metallookandfeel On essaye de l utiliser par UIManager.setLookAndFeel(lf); et de l appliquer à la racine de l arbre par SwingUtilities.updateComponentTreeUI( SwingUtilities.getRoot(this));
Objet JPanel Voici le marche à suivre : Importer la classe javax.swing.jpanel dans notre classe héritée de JFrame. Instancier un JPanel puis lui spécifier une couleur de fond pour mieux le distinguer. Avertir notre JFrame que ce sera notre JPanel qui constituera son content pane.
Graphics & Graphics2D La classe Graphics2D est une classe dérivée de Graphics
Objet Graphics
Objet Graphics
Résumé. Pour créer des fenêtres, Java fournit les composants swing (dans javax.swing) et awt (dans java.awt). Une JFrame est constituée de plusieurs composants. Par défaut, une fenêtre a une taille minimale et n'est pas visible. Un composant doit être bien paramétré pour qu'il fonctionne à votre convenance. L'objet JPanel se trouve dans le package javax.swing. Un JPanel peut contenir des composants ou d'autres conteneurs. Lorsque vous ajoutez un JPanel principal à votre fenêtre, n'oubliez pas d'indiquer à votre fenêtre qu'il constituera son content pane. Pour redéfinir la façon dont l'objet est dessiné sur votre fenêtre, vous devez utiliser la méthode paintcomponent() en créant une classe héritée. Cette méthode prend en paramètre un objet Graphics. Cet objet doit vous être fourni par le système. C'est lui que vous allez utiliser pour dessiner dans votre conteneur. Pour des dessins plus évolués, vous devez utiliser l'objet Graphics2D qui s'obtient en effectuant un cast sur l'objet Graphics
Animation Travaux pratiques
TP.
Les Boutons Objet JButton Positionner Interagir Classes interne et anonymouse Travaux pratiques : Calculatrice Importer vos applications en JAR
Objet JButton
Objet JButton
Positionner BorderLayout
Positionner GridLayout
Positionner BoxLayout
Interagir MouseListener
Interagir ActionListener
Interagir
Classes internes
Classes anonymes
TP. Notre propre calculatrice!
Importer votre application en.jar
Multi-Threading Pourquoi?
Multi - threading En cas de problème, la fenêtre...
Multi - threading Thread principal Deuxième Thread
Multi-Threading par héritage Java utilise un ordonnanceur
Multi Threading par héritage Un thread peut présenter plusieurs états : NEW : lors de sa création RNNABLE : lorsqu'on invoque la méthode start(), le thread est prêt à travailler. TERMINATED : lorsque le thread a effectué toutes ses tâches ; on dit aussi qu'il est «mort». Vous ne pouvez alors plus le relancer par la méthode start(). TIMED_WAITING : lorsque le thread est en pause (quand vous utilisez la méthode sleep(), par exemple). WAITING : lorsque le thread est en attente indéfinie. BLOCKED : lorsque l'ordonnanceur place un thread en sommeil pour en utiliser un autre, il lui impose cet état.
Multi-threading par héritage
Mutli-threading par héritage
Multi-threading par Runnable
Multi-threading par Runnable
Multi-threading par Runnable
Autres objets Swing
Résumé Un nouveau thread permet de créer une nouvelle pile d'exécution. La classe Thread et l'interface Runnable se trouvent dans le package java.lang, aucun import spécifique n'est donc nécessaire pour leur utilisation. Un thread se lance lorsqu'on invoque la méthode start(). Cette dernière invoque automatiquement la méthode run(). Les opérations que vous souhaitez effectuer dans une autre pile d'exécution sont à placer dans la méthode run(), qu'il s'agisse d'une classe héritant de Thread ou d'une implémentation de Runnable. Pour protéger l'intégrité des données accessibles à plusieurs threads, utilisez le mot clé synchronized dans la déclaration de vos méthodes. Un thread est déclaré mort lorsqu'il a dépilé la méthode run() de sa pile d'exécution. Les threads peuvent présenter plusieurs états : NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING et TERMINATED.
Pattern MVC MVC va vous apprendre à découper vos codes en trois parties : modèle, vue et contrôleur.
Vue Ce que l'on nomme «la vue» est en fait une IHM. Elle représente ce que l'utilisateur a sous les yeux. La vue peut donc être : une application graphique Swing, AWT, SWT pour Java (Form pour C# ) ; une page web ; un terminal Linux ou une console Windows ; etc.
Vue
Modèle Le modèle peut être divers et varié. C'est là que se trouvent les données. Il s'agit en général d'un ou plusieurs objets Java. Ces objets s'apparentent généralement à ce qu'on appelle souvent «la couche métier» de l'application et effectuent des traitements absolument transparents pour l'utilisateur. Par exemple, on peut citer des objets dont le rôle est de gérer une ou plusieurs tables d'une base de données. En trois mots, il s'agit du cœur du programme!
Contrôleur Cet objet - car il s'agit aussi d'un objet permet de faire le lien entre la vue et le modèle lorsqu'une action utilisateur est intervenue sur la vue. C'est cet objet qui aura pour rôle de contrôler les données.
Scénario Dans une application structurée en MVC, voici ce qu'il peut se passer : l'utilisateur effectue une action sur votre vue ; l'action est captée par le contrôleur, qui va vérifier la cohérence des données et éventuellement les transformer afin que le modèle les comprenne. Le contrôleur peut aussi demander à la vue de changer ; le modèle reçoit les données et change d'état (une variable qui change, par exemple) ; le modèle notifie la vue (ou les vues) qu'il faut se mettre à jour ; l'affichage dans la vue (ou les vues) est modifié en conséquence en allant chercher l'état du modèle.
MVC 1 & MVC 2 MVC 1, Chaque modèle possède son propre contrôleur. MVC 2, Présence d'un super contrôleur.
Des objets qui parlent et qui écoutent : le pattern observer Il fait communiquer des objets entre eux ; c'est un bon moyen d'éviter le couplage d'objets.
Le pattern Observer La vue implémente l'interface Observer Le modèle implémente l'interface Observable
Calculatrice. JFrame Observable implémente héritage AbstractModel Observer implémente use héritage Fenêtre use AbstractContrôleur Calculette héritage JPanel JButton CalculetteContrôleur
Découpage en packages JFrame Observable implémente héritage AbstractModel Observer implémente use héritage Fenêtre use AbstractContrôleur Calculette héritage JPanel JButton CalculetteContrôleur
Résultats
Découpage en packages