Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS JAVA FAQs TUTORIELS JAVASEARCH SOURCES LIVRES OUTILS, EDI & API ECLIPSE NETBEANS BLOG DISCUSSIONS TV

ExtendedJFrame

L'Api ExtendedFrame fournit une JFrame étendue, l'ExtendedJFrame. Cette fenêtre peut être modale, peut être bloquée avec une animation, peut afficher un message d'état, peut être réduite dans le Systray, bref, permet de faire beaucoup de choses. Ce tutoriel va vous faire découvrir ExtendedFrame et va vous apprendre à vous en servir.

Moyenne des évaluations : Bon (2 votes) Laisser un commentaire


I. Introduction
II. Fonctionnalités de base
III. Fenêtres modales
IV. Animations d'attente
V. Réduction dans le System Tray
VI. Personnalisation des éléments
VI-A. La barre de titre
VI-B. La barre d'état
VI-C. L'animation d'attente
VII. Fonctionnalités à venir
VIII. Bugs connus
IX. Téléchargements
X. Versions
X-A. Version 1.0
X-B. Version 1.1
X-C. Version 1.2
X-D. Version 1.3
X-E. Version 1.4

I. Introduction

ExtendedFrame est une API sous licence GPL que j'ai développée tout d'abord pour avoir des JFrame puis je l'ai étendue pour en faire une Api. J'y ai rajouté plusieurs fonctionnalités que je je trouvais utile puis je l'ai modularisée pour en rendre l'utilisation plus simple.

Pour le moment, toutes les fonctionnalités ont été testées sous Windows XP et Vista avec Succès, mais je n'ai pas encore testés ExtendedJFrame sur les autres systèmes d'exploitation.

Cette API est sous licence LGPL.

II. Fonctionnalités de base

Pour commencer, vous pouvez employer une ExtendedJFrame comme n'importe quelle JFrame. Son apparence est juste différente car la barre de titre est entièrement dessinné par Swing. La base d'une ExtendedJFrame étant une JFrame undecorated.

Vous pouvez donc l'utiliser de la même manière qu'une JFrame :

ExtendedJFrame simpleFrame = new ExtendedJFrame("Extended Frame");

test.setLocationRelativeTo(null);
test.setSize(new Dimension(300,300));
test.setVisible(true);

Ce simple code vous donnera une fenêtre comme celle-là :

ExtendedJFrame basique

Vous pouvez rajouter un message d'état en utilisant le constructeur :

ExtendedJFrame simpleFrame = new ExtendedJFrame("Extended Frame", null, "State");

Cela devrait vous afficher telle que celle-ci :

ExtendedJFrame avec barre d'état

Vous avez vu maintenant comment utiliser les fonctionnalités de base de ExtendedJFrame. Les chapitres suivants vont vous montrer comment utiliser les fonctionnalités plus avancées.

III. Fenêtres modales

Une ExtendedJFrame peut être modale, c'est à dire qu'elle bloque les actions sur la fenêtre parente. A chaque fois qu'une action est effectuée sur la fenêtre parente, la fenêtre modale revient en premier plan. Cela fonctionne pour les actions sur tout le contentPane et toutes les actions sur la barre de titre.

Voilà comment vous pouvez créer une ExtendedJFrame modale :

final ExtendedJFrame blocked = new ExtendedJFrame("Blocked Frame");
		
blocked.setSize(new Dimension(300,300));
blocked.getContentPane().add(new JButton("test"));
blocked.setVisible(true);

ExtendedJFrame modal = new ExtendedJFrame("Modal Frame", blocked);
modal.setDisplaySystrayButton(true);
modal.setSize(new Dimension(200,200));
modal.getContentPane().add(new JButton("test"));
modal.setVisible(true);

IV. Animations d'attente

Une fonction pratique est de pouvoir bloquer le contentPane d'une fenêtre pendant l'éxécution d'un tâche. Vous pouvez donc afficher une animation d'attente par dessus le content pane de votre ExtendedJFrame pendant qu'une autre tâche s'éxécute. Cela permet de faire attendre l'utilisateur. Par défaut, deux animations sont proposées :

  • DefaultWaitFigure : C'est une simple JProgressBar infinie.
  • InfiniteWaitFigure : C'est une animation complexe en 2D basée sur l'InfiniteProgressPanel de Romain Guy. Elle affiche des barres disposés en cercle et ces barres changent de couleur.

Voilà comment faire attendre votre fenêtre :

final ExtendedJFrame blocked = new ExtendedJFrame("Wait Frame");
		
SwingUtilities.invokeLater(new Runnable(){
	public void run(){
		blocked.setSize(new Dimension(300,300));
		blocked.setVisible(true);
	}
});

SwingUtilities.invokeLater(new Runnable(){
	public void run(){
		blocked.startWait(); //Début de l'animation d'attente
		
		//Création du thread pour éxécuter l'opération longue
		Thread wait = new Thread(new Runnable() {
            public void run() {
            	try {
					Thread.sleep(10000); //Opération longue
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
            	
            	blocked.stopWait(); //Fin de l'animation d'attente
            }
        });
		wait.start();
	}
});

Voici le résultat de code :

ExtendedJFrame avec DefaultWaitFigure

Si vous voulez utiliser l'InfiniteWaitFigure, il vous suffit de rajouter la ligne de code suivante :

blocked.setWaitFigure(new InfiniteWaitFigure());

Voici ce que ça va vous donner :

ExtendedJFrame avec InfiniteWaitFigure

V. Réduction dans le System Tray

Vous pouvez aussi réduire une ExtendedJFrame dans le System Tray, c'est à dire dans la barre de notification habituellement en bas à droite de votre écran.

Pour cela, il vous suffit d'utiliser une ExtendedFrame tout à fait normale et d'indiquer qu'il faut afficher le bouton de réduction dans le Systray avec la méthode suivante :

frame.setDisplaySystrayButton(true);

Cela va rajouter un quatrième bouton dans la barre de titre qui va vous permetre de réduire la fenêtre dans la zone de notification.

ExtendedJFrame réduite dans le System Tray

Vous pouvez aussi utiliser votre propre TrayIcon en passant un TrayIcon personnalisé au constructeur :

ExtendedJFrame test = new ExtendedJFrame("Extended Frame", null, null, "", yourTrayIcon);

VI. Personnalisation des éléments

Certaines des éléments de l'ExtendedJFrame sont personnalisables à condition qu'ils étendent la bonne classe ou la bonne interface. Il s'agit de la barre de titre, de la barre d'états et des animations d'attente.

VI-A. La barre de titre

Vous pouvez utiliser votre propre barre de titre, il vous faut juste implémenter la classe abstraite TitleBar dont voici les méthodes :

  • public abstract void setTitle(String title) : Cette méthode permet de changer le titre de la barre de titre
  • public abstract String getTitle() : Cette méthode permet de récupérer le titre de la barre de titre
  • public abstract void setImageIcon(ImageIcon icon) : Cette méthode permet de changer l'icône de la barre de titre
  • public abstract ImageIcon getImageIcon() : Cette méthode permet de récupérer l'icône de la barre de titre
  • public abstract void stateChanged(int state) : Cette méthode indique à la barre de titre que l'état de l'ExtendedJFrame a changé. Elle est initialement utilisée pour changed l'icone maximize en restore et vice-versa.
  • public abstract void block() : Cette méthode permet de bloquer la barre de titre. Elle est appelée quand la fenêtre se bloque.
  • public abstract void deblock(); Cette méthode permet de débloquer la barre de titre. Elle est appelée quand la fenêtre se débloque.
  • public abstract void displaySystrayButton(boolean state) : Cette méthode permet d'afficher ou non le bouton de réduction dans le systray.

Une fois que votre nouvelle classe étend bien TitleBar et redéfinit toutes ses méthodes. Il vous suffit d'utiliser la méthode setTitleBar() sur votre ExtendedJFrame pour l'appliquer. Attention, cette méthode n'est disponible qu'à partir de la version 1.1.

VI-B. La barre d'état

Vous pouvez utiliser votre propre barre d'état, il vous faut juste implémenter la classe abstraite StateBar dont voici les méthodes :

  • public abstract void setText(String text) : Modifie le texte de la barre d'état
  • public abstract String getText() : Retourne le texte de la barre d'état

Une fois que votre nouvelle classe étend bien StateBar et redéfinit toutes ses méthodes. Il vous suffit d'utiliser la méthode setStateBar() sur votre ExtendedJFrame pour l'appliquer. Attention, cette méthode n'est disponible qu'à partir de la version 1.1.

VI-C. L'animation d'attente

Vous pouvez aussi utiliser votre propre animation d'attente. Pour cela, il vous faut juste implémenter l'interface WaitFigure dont voici les méthodes :

  • public void init() : Cette méthode initialise la figure d'attente
  • public void start() : Cette méthode démarre l'animation
  • public void stop() : Cette méthode stoppe l'animation.
  • public void paint(Graphics g) : Cette méthode vous permet de dessinner quelque chose dans le Graphics du glasspane. Cette méthode est appellé juste après le paintComponent du glass pane
  • public void setBounds(int width, int height) : Cette méthode vous permet de dimensionner votre figure en fonction de la taille du glasspane
  • public void setApparentedGlassPane(JComponent glassPane) : Cette méthode vous permet de récupérer le glasspane parent de votre animation. Cela vous permettra ensuite d'intéragir avec le glasspane par exemple pour y dessinner quelque chose.

Ensuite, pour l'attacher à la fenêtre, il vous suffit de faire comme on a vu dans le chapitre IV.

VII. Fonctionnalités à venir

Voici quelques fonctionnalités ou améliorations qui vont être intégrées dans ExtendedFrame :

  • Rajout de nouvelles WaitFigure
  • Rajout d'une nouvelle barre de titre avec des sous-titres
  • Rajout d'une nouvelle barre d'état avec possibilité de mettre plusieurs messages et des contenus spéciaux

Je ne peux pas donner de dates ni même d'estimations de temps pour ces ajouts. En effet, je ne travaille sur cette api que lors de mon temps libre et j'ai aussi d'autres projets à coté de celui-ci. ExtendedFrame n'est d'ailleurs qu'un sous-projet de JTheque.

VIII. Bugs connus

Voici les différents bugs connus dans ExtendedJFrame :

  • Sous Unix, on a une IllegalArgumentException lancée par ExtendedTitleBar

IX. Téléchargements

Vous pouvez télécharger l'api ExtendedFrame, ses sources ainsi que sa documentation sur SourceForge.

X. Versions

X-A. Version 1.0

Version de base d'ExtendedJFrame.

X-B. Version 1.1

Voici les changements de cette version :

  • Ajout des méthodes setTitleBar et setStateBar dans la classe ExtendedJFrame
  • Les icônes sont maintenant externalisés dans le fichier ressources.properties. On y accède via la nouvelle classe Ressources.
  • Les constructeurs d'ExtendedJFrame, DefaultWaitFigure et InfiniteWaitFigure ont été légérement revus
  • La méthode displaySystrayButton() est renommé en setDisplaySystrayButton()
  • La méthode reduceInSystray devient public et la méthode exitOfSystray lui est adjointe
  • On peut savoir si une fenêtre est dans le systray avec la méthode isReducedInSystray()
  • Le bug avec les fenêtres modales iconifiées a été corrigé

X-C. Version 1.2

Voici les changements de cette version :

  • Passage de l'API en LGPL
  • Ajout d'une méthode setPropertiesFile pour configurer le fichier de ressources
  • Ajout de tooltip sur les boutons de la barre de titre
  • Refactorings divers sur le code et la documentation

X-D. Version 1.3

Voici les changements de cette version :

  • Modification de l'interface graphique
  • Ajout d'une classe GradientTitleBar qui offre un titre en dégradé
  • Modification d'un bug au niveau des tooltips
  • Refactorings divers sur le code et la documentation

X-E. Version 1.4

Voici les changements de cette version :

  • Correction du problème d'affichage de l'icône
  • Ajout de la transparence sur le glasspane
  • Ajout méthodes pour configurer la modalité (setModal, setParent)
  • Correction du bug de la taille du glasspane
  • Modifications d'InfiniteWaitFigure
  • Correction de l'alignement des boutons dans la barre de titre par défaut

Copyright © 2007 Baptiste Wicht (Wichtounet). Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique Java : Eric Siber et Baptiste Wicht - Contacter par EMail :
Vos questions techniques : forum d'entraide Java - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.