Академический Документы
Профессиональный Документы
Культура Документы
Cette faq a été réalisée à partir des questions fréquemment posées sur les forums de
http://www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette faq ne garantit en aucun cas que les informations
qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est
humaine. Cette faq ne prétend pas non plus être complète. Si vous trouvez une erreur,
ou que vous souhaitez nous aider en devenant rédacteur, lisez Comment participer à
cette faq ?.
L'équipe Java
Ont contribué à cette FAQ :
-3-
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
L'organisation :
Les questions sont organisées par thème, les thèmes pouvant eux-même contenir des sous-thèmes. Lorsqu'une question
porte sur plusieurs thèmes, celle-ci est insérée dans chacun des thèmes rendant la recherche plus facile.
Les réponses :
Les réponses contiennent des explications et des codes sources. Certaines sont complétées de fichier à télécharger
contenant un programme de démonstration. Ces programmes sont volontairement très simples afin qu'il soit aisé de
localiser le code intéressant. Les réponses peuvent également être complétées de liens vers d'autres réponses, vers la
documentation en ligne de Sun ou vers un autre site en rapport.
J'espère que cette faq pourra répondre à vos questions. N'hésitez pas à nous faire part de tous commentaires/remarques/
critiques.
Rédacteur :
Bien évidemment, toute nouvelle question/réponse est la bienvenue.
Web designer :
Toute personne capable de faire une meilleur mise en page, une feuille de style ou de belles images...
Correcteur :
-4-
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Malgré nos efforts, des fautes d'orthographe ou de grammaire peuvent subsister. Merci de contacter les administrateurs
si vous en débusquez une... Idem pour les liens erronés.
Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs :
- Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la licence GNU FDL traduite
en français ici. Permission vous est donnée de distribuer, modifier des copies des contributions de Clément Cunin et
Johann Heymes tant que cette note apparaît clairement :
"Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission
vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement".
- Pour ce qui est des autres contributions : Copyright © 2004 Developpez LLC : Tous droits réservés Developpez LLC.
Aucune reproduction ne peut en être faite sans l'autorisation expresse de Developpez LLC. 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.
Remerciements
Auteurs : L'équipe Java ,
Un grand merci à tous ceux qui ont pris de leur temps pour la réalisation de cette FAQ.
Aux rédacteurs :
Remerciements tout d'abord à tous ceux qui ont rédigé les questions et les réponses.
Clément Cunin, Johann Heymes, Nicolas Cuny, Ronan Le Gallo, Christophe Ludet, Jean-Baptiste Bugeaud, Sebastien
Andreo, Grégory Danelon, Sébastien Meric, Romain Guy, Pierre-Yves Varoux, Ioan, bahamouth, duj, Braim, bulbo,
Ricky81, Debernad, jcarre, David Seigne, xavlours, christopheJ, willowII, Nourdine Falola, laffreuxthomas.
Aux correcteurs :
-5-
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Remerciements également aux personnes qui ont relu les textes pour supprimer un maximum de fautes de français.
Nicolas Cuny, Jonathan Muller, Etienne Bar, Bestiol, Ukyuu.
Aux visiteurs :
Remerciements enfin à tous ceux qui ont consulté cette FAQ, et qui, par leurs remarques, nous ont aidé à la
perfectionner.
Et pour finir, un merci tout spécial à Clément Cunin, qui est à l'origine de cette FAQ, à cyberzoide pour notre logo et
ses conseils avisés et à tous les membres de l'équipe qui nous ont fourni outils et logiciels nécessaires pour la réalisation
de ce document.
-6-
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Le centrage doit être effectué par rapport à un composant affiché au moment où l'on veut centrer notre fenêtre...
Généralement juste avant de la rendre visible. (si le paramètre est null ou que le composant n'est pas affiché, le centrage
est fait par rapport à l'écran.)
frame.pack();
/* la fenêtre prend sa taille... */
frame.setLocation(
(screenSize.width-frame.getWidth())/2,
(screenSize.height-frame.getHeight())/2
);
-7-
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
N'oubliez pas que la caractéristique principale du BorderLayout est d'ajuster la dimension du composant à la place
disponible.
Si l'on a besoin d'une mise en forme particulière, il est possible de créer des gestionnaires de mise en forme personnalisés.
En spécifiant les coordonnées
Il est possible de se passer des gestionnaires de mise en forme pour le placement des composants. Pour cela, on définit
le gestionnaire de mise en forme du contenant à null, on ajoute le composant au contenant et on spécifie la position
absolue et la taille voulue du composant :
setLayout(null);
JButton ok = new JButton("OK");
ok.setBounds(x,y,width,height); // param int
-8-
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
{
public FlowLayoutFrame ()
{
setTitle("FlowLayout Test");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
getContentPane().add(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Container c = getContentPane();
-9-
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
// setLayout(new BorderLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
setLayout(new GridLayout(2,3));
Container c = getContentPane();
- 10 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
c.add(new JButton("(1,1)"));
c.add(new JButton("(1,2)"));
c.add(new JButton("(1,3)"));
c.add(new JButton("(2,1)"));
c.add(new JButton("(2,2)"));
c.add(new JButton("(2,3)"));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Par défaut, les composants sont collés les uns aux autres. Pour les espacer, il faut insérer des réserves entre les
composants. Il en existe 3 types :
• le Strut, qui ajoute un espace mesuré en nombre de pixels. Le Strut est unidimensionnel : il existe un Strut
horizontal et un Strut vertical
• le RigidArea, qui est équivalent à un couple de Strut horizontal/vertical
• le Glue, qui repousse les 2 composants voisins aussi loin que possible l'un de l'autre.
- 11 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Container c = getContentPane();
c.add(vBox,BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
- 12 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Ce sont les contraintes qui détermineront la position des composants et le comportement en cas de redimenssionnement
de la fenêtre. Les paramètres d'un GridBagConstraints sont :
• gridx, gridy (int) : numéros de ligne et de colonne du coin supérieur gauche de la zone d'affichage du composant.
• gridwidth, gridheight (int) : largeur et hauteur du composant en nombre de cellule.
• fill (int) : comportement du composant lors du redimensionnement si sa taille et celle de la zone d'affichage ne
correspondent pas.
• anchor (int) : alignement du composant dans la zone d'affichage.
• weigthx, weigthy (double) : comportement de la zone d'affichage en cas de redimenssionnement du tableau.
• ipadx, ipady (int) : valeurs ajoutées à la taille minimale du composant (par 2 fois : ipadx à gauche et à droite,
ipady en haut et en bas)
• insets (Insets) : définit les marges autour du composant.
La documentation AWT recommande de remplacer la définition des paramètres gridx et gridy en valeurs absolues,
par la constante GridBagConstraints.RELATIVE. Pour indiquer qu'un composant est le dernier d'une ligne, on donne
alors à la largeur de sa zone d'affichage (gridwidth) la valeur GridBagConstraints.REMAINDER. On donne cette même
valeur à la hauteur de la zone d'affichage des composants de la dernière ligne.
Etapes pour utiliser un GridBagLayout:
[1] Mettre en forme le composant sur papier.
[2] Etablir la grille avec une cellule pour les petits composants, plusieurs pour les plus gros.
[3] Libeller les lignes et les colonnes. Ces libellés donneront les valeurs de gridx, gridy, gridwidth, gridheight.
[4] Définir le dimensionnement (fill) et l'alignement (anchor) des composants.
[5] Mettre tous les poids (weightx et weigthy) à 100, on ajoustera les poids ensuite. Mettre 0 pour les composants
qui restent toujours à leur taille par défaut.
- 13 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
face.addActionListener(listener);
size.addActionListener(listener);
- 14 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
- 15 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
NOTE: Le didactiel de Sun suggère d'utiliser le même objet GriBagConstraints pour tous les composants. Cependant,
le code devient difficile à lire et est sujet aux erreurs (oublie de modification d'un paramètre qui avait été modifié pour
un précédent composant). Aussi est-il préférable d'utiliser un nouveau GriBagConstraints pour chaque composant.
L'exemple de la question Comment utiliser le GridBagLayout ?,réarrangé en employant la classe GBC, devient :
// construct components
face.addActionListener(listener);
size.addActionListener(listener);
- 16 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
sample.setEditable(false);
sample.setLineWrap(true);
sample.setBorder(BorderFactory.createEtchedBorder());
Container cp = getContentPane();
cp.add(faceLabel, new GBC(0, 0).setAnchor(GBC.EAST));
cp.add(face, new GBC(1, 0).setFill(GBC.HORIZONTAL).setWeight(100, 0).setInsets(1));
cp.add(sizeLabel, new GBC(0, 1).setAnchor(GBC.EAST));
cp.add(size, new GBC(1, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0).setInsets(1));
cp.add(bold, new GBC(0, 2, 2, 1).setAnchor(GBC.CENTER).setWeight(100, 100));
cp.add(italic, new GBC(0, 3, 2, 1).setAnchor(GBC.CENTER).setWeight(100, 100));
cp.add(sample, new GBC(2, 0, 1, 4).setFill(GBC.BOTH).setWeight(100, 100));
}
- 17 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
} finally {
myDevice.setFullScreenWindow(null);
}
} else {
System.err.println("Plein écran non supporté");
}
Changement de résolution :
La diminution de la résolution est particulièrement conseillée pour augmenter la performance d'affichage ( moins il y
a de pixels, mieux c'est ). Une configuration est définie par une instance de java.awt.DisplayMode. Exemple de code :
myDevice.setDisplayMode(new DisplayMode(
800,
600,
DisplayMode.BIT_DEPTH_MULTI,
DisplayMode.REFRESH_RATE_UNKNOWN
));
Avant de commencer :
Avant de vous embarquer dans la réalisation d'un super jeu en plein écran, je vous conseille de vous renseigner un
minimum sur les techniques d'optimisation et d'accélération de l'affichage (vois lien ci-dessous).
Et les applets ?
Les applets sont autorisées à passer en affichage plein écran seulement si l'utilisateur a la permission
fullScreenExclusive.
lien : http://java.sun.com/docs/books/tutorial/extra/fullscreen/
lien : Comment accélérer le rendu graphique de mon dessin ?
lien : Comment utiliser le double-buffering software ?
Si l'image n'apparaît pas, c'est certainement que le paramètre image a une valeur 'null'.
Une autre raison pour laquelle cette image n'apparaitrait serait un problème au niveau de la transparence avec les
images PNG qui ne sont pas gérés par tous les OS, certains OS vont l'afficher mais supprimmer la transparence et
d'autres ne pas l'afficher.
- 18 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
De plus, certains OS ne supportent simplement pas les images de type PNG, transparence ou non.
Note :
Tant qu'une fenêtre n'est pas détruite, elle ne peut pas être collectée par le ramasse miettes.
lien : Comment fermer une fenêtre lors d'un clic sur la croix en haut à droite ?
Comment fermer une fenêtre lors d'un clic sur la croix en haut à droite ?
Auteurs : Clément Cunin ,
AWT :
Lorsque l'on créer une fenêtre avec AWT, aucune action n'est associée à la commande de fermeture de cette fenêtre.
Nous allons donc en associer une.
maFenetre.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
hide();
}
} );
SWING :
Par défaut, les fenêtres Swing sont cachées lorsque l'utilisateur clic sur la croix. Cette action par défaut peut facilement
être remplacée avec setDefaultCloseOperation(int).
maFenetre.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
- 19 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Note : La solution utilisée avec AWT reste valable avec Swing, elle permet d'effectuer des traitements plus complexes
en parallèle du traitement par défaut.
A partir du JDK1.4
Le jdk1.4 définit une nouvelle méthode setUndecorated(boolean) pour les classes java.awt.Frame et java.awt.Dialog.
Attention : cette méthode doit être appelée avant le premier affichage de la fenêtre à l'écran.
- 20 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
//placement et redimension
frame.setSize(dimension);
frame.setLocation(x,y);
}
Si il existe plusieurs fenêtres ayant cette propriété à true, le comportement sera défini par le système. De plus, cette
méthode est susceptible de lever une SecurityException.
Attention : Cette fonctionnalité n'est disponible dans l'API standard que depuis la version 1.5 de J2SE. Pour les versions
précédentes, la seule possibilité est de passer par JNI et des API natives.
L'instance de GraphicsConfiguration s'obtient depuis le GraphicsDevice associé à l'écran. Ainsi, pour afficher une
JFrame sur le second écran (si il est présent), on utilisera le code suivant :
- 21 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Si le GraphicsConfiguration vaut null, c'est celui de l'écran principal qui sera utilisé...
La classe GraphicsDevice permet également d'obtenir d'autres informations sur l'écran, tel que la résolution actuelle
et la liste des résolutions supportées...
KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow()
- 22 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Pour obtenir cette espace, il faut dans un premier temps récupérer la taille de l'écran. Il suffit ensuite de récupérer les
marges de l'écran, de la manière suivante :
Ces marges correspondent à l'espace occupé par les différentes barres d'outils du système. Il est ainsi possible de
déterminer l'espace utile du bureau graphique de l'utilisateur.
- 23 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Gardez toujours à l'esprit que certains systèmes n'ont pas de 2ème et/ou 3ème bouton, les traitements doivent donc être
accessibles par un autre moyen.
setCursor(Frame.celui_desire);
// par exemple : DEFAULT_CURSOR, WAIT_CURSOR ...
JDK 1.1 et +:
myComponent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Sachant que la classe Cursor définit un certain nombre de curseurs par défaut ( DEFAULT_CURSOR,
WAIT_CURSOR... ) on peut ainsi changer le curseur dans un Dialog ce qui n'était pas possible précédemment. Le
- 24 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
changement de curseur est automatiquement hérité par tous les fils, sauf si ceux-çi précisent explicitement un autre
curseur.
lien : Comment traiter les "simple clic" et les "double clic" de manière exclusive ?
Comment traiter les "simple clic" et les "double clic" de manière exclusive ?
Auteurs : Clément Cunin ,
De manière générale, ce cas ne devrait pas se produire. Le double clic ayant souvent une fonction complémentaire du
simple clic.
La seule solution est l'utilisation de 'timer' qui sera lancé lors d'un simple clic et arrêté lors d'un 2ème clic. Si le temps
est écoulé sans que le timer n'ait été arrêté par le 2ème clic, alors on exécute l'action associée au simple clic !
Attention :
Le déplacement automatique de la souris a le don d'énerver certains utilisateurs, il est donc conseillé de l'utiliser
prudemment et/ou de permettre à l'utilisateur de désactiver cette fonction.
- 25 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
En enregistrant un MouseEvent auprès de votre composant graphique, vous pouvez avoir accès à la position de la souris
relativement à ce composant. Il vous suffira ensuite d'utiliser la méthode getLocationOnScreen() de Component pour
calculer la position de la souris par rapport à l'écran.
Vous pouvez aussi utiliser la méthode convertPointToScreen() de la classe javax.swing.SwingUtilities. Par exemple :
A partir de Java 5.0 (Tiger), si vous voulez connaître la position de la souris (même en dehors d'une fenêtre) vous pouvez
utiliser l'objet MouseInfo du package java.awt. Par exemple :
Attention, l'instance de PointerInfo n'est pas mise à jour automatiquement. Vous devrez en récupérer une nouvelle
instance à chaque fois.
Avant Java 5.0, la seule solution possible est de passer par JNI (Java Native Interface). Vous pourrez ainsi avoir accès
grâce à des langages plus proches du système aux cooordonnées de la souris à l'écran. Attention tout de même, vous
risquez de perdre la portabilité de votre application.
- 26 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Bien sur il est possible de combiner plusieurs touches, par exemple pour faire un A majuscule, il faut combiner le A
avec la touche shift.
- 27 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Dans les 2 cas, le dessin sera assuré par la classe java.awt.Graphics2D. Vous ne devez en aucun cas essayer de construire
une instance de cette classe. Pour dessiner dans un composant graphique, l'instance vous est donnée en paramètre de la
méthode paint(AWT) ou paintComponent(SWING). Pour le dessin dans une image, on crée un objet java.awt.Image,
puis on utilise la méthode getGraphics() pour récupérer l'objet Graphics et dessiner dans l'image.
Dessiner dans une image ne pose pas de problèmes majeurs mais la personnalisation de composants graphiques nécessite
de bien comprendre Pourquoi mon composant s'efface quand je redimensionne la fenêtre ?
- 28 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
- 29 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Le fait que la taille du pinceau soit précisée par un nombre réel peut surprendre, difficile en effet d'imaginer une ligne
de 2.5 pixels. Pour comprendre, il suffit de s'imaginer le cas d'une ligne oblique, ou le cas d'un tracé avec Comment
activer le lissage des textes et/ou des graphiques ?.
- 30 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
));
Le booléen 'cyclique' permet de définir comment gérer les points au-delà des bornes.
Le double buffering :
- 31 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
L'utilisation d'un double buffer est particulièrement recommandée pour l'affichage d'animations complexes ou de
composants de grande taille. Voir Comment utiliser le double-buffering software ?
public DoubleBufferingSoftware(){
//affichage
setSize( 400, 400 );
setVisible( true );
}
public void update(Graphics g){
paint(g);
}
public void paint( Graphics g ){
//création du buffer si il n'existe pas
if(buffer==null){
image = createImage(400,400);
buffer = image.getGraphics();
}
//on dessine sur le buffer mémoire
buffer.setColor( Color.white );
buffer.fillRect( 0, 0, 400, 400 );
buffer.setColor( Color.black );
buffer.drawString( "affichage d'une ligne de texte", x, 200 );
x++;
if(x>400) x = 0;
// finalement, le buffer mémoire est dessiné dans le buffer d'affichage
g.drawImage(image, 0, 0, this);
}
class RenderingThread extends Thread {
/**
* Ce thread appelle le rafraichissement de notre fenêtre
* toutes les 10 milli-secondes
*/
public void run(){
while(true){
try {
- 32 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
repaint();
sleep( 10 );
} catch ( Exception e ) {}
}
}
}
public static void main(String[] args){new DoubleBufferingSoftware();}
}
Principe : On créé un buffer qui va servir de buffer mémoire (celui où l'on dessine dessus), puis on créé un buffer
qui va servir de buffer graphique (celui qui s'occupe d'afficher ce qu'il contient à l'écran). On dessine sur le buffer
mémoire, des images, des textes, des dessins, ... pendant que le buffer graphique affiche ce qu'il contient. Puis, on swap
les buffers(en clair, on les inverse), le buffer mémoire devient le buffer graphique et le buffer graphique devient le buffer
mémoire. On les appelle habituellement: BackBuffer (buffer mémoire) et FrontBuffer (buffer graphique).
Voici la méthode qui permet d'utiliser la mémoire vidéo de votre carte graphique (VRAM) :
public DoubleBufferingHardware(){
setSize( 400, 400 );
setVisible( true );
- 33 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
createBufferStrategy( 2 );
pour ceci:
createBufferStrategy( 3 );
La reponse est non car les cartes graphiques ne le gèrent pas, si vous le tentez, soit votre carte le supporte et tournera
en fait en triple-buffering, soit vous ferez planter votre programme ou aurez de gros bugs à l'affichage.
Inconvénients du triple-buffering ?
Et bien, les cartes actuelles tournent moins bien avec le triple que le double, résultat des courses, vous allez perdre en
images par seconde lors de l'affichage. Cette diminution en performance est de l'ordre de 3 ce qui n'est pas négligeable.
Avantages du triple-buffering ?
- 34 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
• Si le double-buffering ne suffisait pas à nettoyer tous les bugs d'affichage, le triple-buffering peut finir de les
nettoyer. Cependant, il est vraiment très rare que le double-buffering ne suffise pas à nettoyer les bugs graphiques.
• Dans le cas où vous faites du plein écran avec votre programme et que vous faites du double-buffering, vous avez
dû remarquer que le compteur d'images par secondes est de 70-85 (bizarrement comme votre rafraichissement
d'écran sur windows), ceci est dû au fait que le double-buffering se synchronise avec le rafraichissement de votre
écran. La solution pour passer outre cette synchronisation est le triple-buffering, celui-ci permet de casser la V-
sync (synchronisation des FPS avec le rafraichissement vertical de l'écran).
- 35 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Dans un applet :
La classe Applet fournit tout le nécessaire pour la lecture d'image :
A noter qu'avec ImageIO, les images sont complètement chargées lors du retour de la méthode read(), alors que les
images renvoyées par le Toolkit sont chargées en arrière plan.
- 36 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Dans un Jar :
Si l'image se trouve dans une archive, le plus simple est de laisser le ClassLoader trouver le fichier. Cette solution est
valable que l'image se trouve ou non dans une archive, il est donc préférable de toujours utiliser le ClassLoader afin de
limiter les problèmes lors du déploiement de l'application/applet.
JDK antérieur :
Java ne permettait pas d'enregistrer une image au format GIF, PNG ou JPEG. Il va falloir faire appel à des classes
extérieures permettant le codage de l'image.
• En Java 2, un 'package' est fourni pour enregistrer en JPEG (mais ne fait pas partie des librairies standard) :
http://java.sun.com/products/jdk/1.2/docs/guide/2d/api-jpeg/overview-summary.html
•
Pour le GIF : http://www.acme.com/java/software/Acme.JPM.Encoders.GifEncoder.html
•
Pour le PNG, un encodeur est disponible dans le code source de Batik : http://xml.apache.org/batik
lien : Une page très intéressante sur les différentes librairies disponibles pour la lecture et l'écriture des images.
Comment connaître les types d'images que l'on peut lire ou écrire ?
Auteurs : Ioan Calapodescu ,
La classe ImageIO du package javax.imageio permet l'accès à ces informations. On peut ainsi connaître les types
d'images que l'on peut lire ou écrire en fonction du nom du format, du type MIME ou du suffixe d'un fichier. Voici
un exemple :
import javax.imageio.*;
public class FormatsImages{
public static boolean canRead(String format){
boolean type = ImageIO.getImageReadersByFormatName(format).hasNext();
boolean mime = ImageIO.getImageReadersByMIMEType(format).hasNext();
boolean suffixe = ImageIO.getImageReadersBySuffix(format).hasNext();
String infos = "Informations lecture "+format+" : ";
infos+="Format image = "+type+", ";
infos+="MIME = "+mime+", ";
infos+="Suffixe fichier = "+suffixe;
System.out.println(infos);
return type||mime||suffixe;
}
public static boolean canWrite(String format){
boolean type = ImageIO.getImageWritersByFormatName(format).hasNext();
boolean mime = ImageIO.getImageWritersByMIMEType(format).hasNext();
boolean suffixe = ImageIO.getImageWritersBySuffix(format).hasNext();
String infos = "Informations écriture "+format+" : ";
infos+="Format image = "+type+", ";
infos+="MIME = "+mime+", ";
infos+="Suffixe fichier = "+suffixe;
System.out.println(infos);
- 37 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
return type||mime||suffixe;
}
}
Vous pouvez utiliser ces deux méthodes statiques pour vérifier n'importe quel format.
canRead("gif");
canRead("jpg");
canRead("bmp");
canRead("image/jpeg");
//quelques vérifications sur les possibilités de lecture
canWrite("gif");
canWrite("jpg");
canWrite("bmp");
canWrite("image/jpeg");
//quelques vérifications sur les possibilités d'écriture
Vous pouvez avoir accès à tous les types d'images que vous pouvez lire ou écrire grâce aux méthodes
getReaderFormatNames et getWriterFormatNames. les mêmes méthodes sont disponibles pour les types MIME.
La méthode paintComponent(Graphique g) est chargée de dessiner le composant ; les composants fils seront dessinés
par dessus plus tard.
Exemple (Swing):
- 38 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Exemple (AWT):
Note :
Vous pouvez placer le composant dans la JFrame en utilisant la méthode setContentPane(moncomposant).
Fichier joint :
Vous trouvez, dans les liens ci-dessous, un exemple complet d'implémentation d'un tel objet, permettant d'afficher
l'image en mosaïque ou centrée.
Extension de JPanel pour afficher des images en arrière-plan. Exemple d'utilisation de la classe.
Graphics g = bufferedImage.createGraphics();
g.drawImage(image,0,0,null);
g.dispose();
return( bufferedImage );
}
}
- 39 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
float[ ] matrice = {
0.1f, 0.1f, 0.1f,
0.1f, 0.2f, 0.1f,
0.1f, 0.1f, 0.1f
};
BufferedImageOp op = new ConvolveOp(new Kernel(3,3,matrice));
BufferedImage nouvelleImage = op.filter(bufferedImage, null);
- 40 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
imageSource.getWidth(),
imageSource.getHeight(),
imageSource.getType());
Graphics2D g2d = nouvelleImage.createGraphics();
/** préparation de la transformation */
AffineTransform at = new AffineTransform();
at.rotate(angle,x,y);
g2d.drawImage(imageSource,at,null);
g2d.dispose();
lien : Qu'est-ce que l'encodage entier RGBA des couleurs d'une image ?
- 41 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
/** Les composantes doivent obligatoirement être comprises dans l'intervalle 0-255 */
/**
* Redimensionne une image.
*
* @param source Image à redimensionner.
* @param width Largeur de l'image cible.
* @param height Hauteur de l'image cible.
* @return Image redimensionnée.
*/
public static Image scale(Image source, int width, int height) {
/* On crée une nouvelle image aux bonnes dimensions. */
BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Note :
- 42 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Si l'image n'apparaît pas, c'est certainement que le paramètre image a une valeur 'null'.
Une autre raison pour laquelle cette image n'apparaitrait serait un problème au niveau de la transparence avec les
images PNG qui ne sont pas gérés par tous les OS, certains OS vont l'afficher mais supprimmer la transparence et
d'autres ne pas l'afficher.
De plus, certains OS ne supportent simplement pas les images de type PNG, transparence ou non.
Voici une méthode permettant de récuperer cette information quelque soit le type de l'image :
- 43 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Si vous ne faites pas de dispose() sur le contexte graphique et que vous rafraichissiez beaucoup celui-ci durant
l'utilisation du programme, votre programme sera de plus en plus gourmant en mémoire.
g2d.drawImage(image2, 0, 0, null);
g2d.dispose();
return image1 ;
}
- 44 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
- 45 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Composant AWT :
Un composant AWT lors de sa création est associé à une fenêtre distincte (un homologue, peer en anglais) gérée par
le système d'exploitation sous-jacent. Et c'est cet homologue qui est responsable de son apparence. Cette "manière"
de faire, bien qu'elle ait fait ses preuves et qu'elle ait permis au langage Java de s'imposer, est très lourde (perte de
performance, et consommation excessive de mémoire). C'est pour cette raison que l'on qualifie les composants AWT
par heavyweight (littéralement, poids lourds)
Composant Swing :
Par opposition, les composants Swing sont simplement dessinés à l'intérieur de leur conteneur comme s'il s'agissait d'une
image, et aucun homologue du système sous jacent ne leur est affecté. C'est pourquoi ils sont qualifiés de lightweight
(composants allégés).
Nous noterons également que lors du développement avec AWT il suffit d'ajouter les composants directement au Top-
level Container (Conteneur de Haut Niveau) tel que Frame, Applet, ..., alors que sous Swing il est nécéssaire de les
ajouter à un volet de contenu (Cf : javax.swing.JRootPane). De manière plus parlante je veux parler du :
jframe.getContentPane().add(monComposant);
Voila, ces quelques différences ne sont bien sûr pas exhaustives, Swing posséde bien d'autres avantages, je ne citerai
que : la gestion de bordure, les info-bulles, le défilement, les Look And Feel, de nouveaux LayoutManager, ainsi que
l'architecture MVC (Model-View-Control). Maintenant que l'on a conscience de ces différences, une question reste tout
de meme en suspens... Peut-on mélanger Awt et Swing ?
Explication :
Avant toute chose, il faut bien comprendre les différence entre Awt et Swing : Quel sont les différences entre Awt et
Swing ?.
Le composant JFrame comprend un objet fils qui prend en charge tout ce qui concerne le graphique, il s'agit d'une
instance de JRootPane. Le composant JRootPane est lui même structuré. Il contient un volet structuré en couche
(instance de JLayeredPane) et un volet structuré en pellicule (GlassPane).
- 46 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
• Le composant LayeredPane permet d'insérer une barre de menu ainsi que tout autre composant (cela fait
référence au fameux contentPane de jframe.getContentPane ()). il est également chargé du Z-ordering (algorithme
permettant de ne dessiner que les parties non cachées, suite aux superpositions de composant).
• Le composant GlassPane représente une pellicule qui recouvre tout et qui par exemple peut intercepter tous les
événements souris de l'interface graphique.
Démonstration :
import javax.swing.*;
import java.awt.*;
public AWTSwing () {
JFrame frame = new JFrame ("Peut-on melanger Awt & Swing ?");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setBounds (300, 300, 200, 300);
frame.setVisible (true);
}
Lorsque l'on ouvre le menu contextuel du JComboBox, ce dernier est caché par le composant bouton de type
java.awt.Button.
• Le rendu graphique du composant "bouton" issu de la librairie AWT est délégué à son homologue (peer), par
conséquent la position Z est la même que celle de la Frame (soit de haut niveau)
• Alors que le composant "combo" de type JComcoBox (Swing) n'est que "dessiné" comme une image sur le
conteneur (soit de bas niveau)
- 47 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
La seule solution envisageable est d'uniformiser le code sur la librairie graphique utilisée, soit tout AWT, soit tout
Swing !
La classe Timer :
La classe javax.swing.Timer remplace avantageusement l'utilisation directe de thread. Elle génère un évènement à
intervalles réguliers (à la milli-seconde). C'est le "event-dispatching thread" qui exécute l'évènement, donc on peut
directement modifier des objets graphiques.
Méthodes importantes :
le constructeur de javax.swing.Timer :
Note :
Cette méthode est à utiliser uniquement si le traitement à faire est court en temps d'exécution sinon on aura une interface
non réactive pendant le traitement ....
- 48 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
JDK 1.4 :
Ce bug a été résolu dans la version 1.4 de l'API. Le correctif n'est pas nécessaire.
ou
bouton.setIcon(new ImageIcon("images/bouton.gif"));
Le code ci-dessous dessine un bouton transparent, seul le texte sera affiché en rouge.
- 49 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Voici un exemple qui permet d'enregistrer un composant sous forme d'image JPeg :
if(!component.isOpaque()){
Color bg = component.getBackground();
bg = (bg.getAlpha() < 255) ? new Color(bg.getRed(), bg.getGreen(), bg.getBlue()) : bg;
component.paint(g2d);
g2d.dispose();
try {
ImageIO.write(image, "jpeg", destination);
} catch (IOException e) {
e.printStackTrace();
}
- 50 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Solution :
La solution est assez simple à comprendre : tout traitement long doit être effectué par un autre processus.
try {
UIManager.setLookAndFeel("mon.look.and.Feel");
//on passe au UIManager le nom complet de la classe du Look and Feel
//naturellement, celle-ci doit être disponible dans le CLASSPATH
} catch (InstantiationException e) {
} catch (ClassNotFoundException e) {
} catch (UnsupportedLookAndFeelException e) {
} catch (IllegalAccessException e) {}
Si vous changez le look and feel de votre application en cours d'exécution, vous devez la rafraîchir en utilisant
SwingUtilities.updateComponentTreeUI. Voici un exemple changeant le look and feel de l'application pour le look and
feel natif (celui naturellement utilisé par le système).
- 51 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(frame);
//force chaque composant de la fenêtre à appeler sa méthode updateUI
} catch (InstantiationException e) {
} catch (ClassNotFoundException e) {
} catch (UnsupportedLookAndFeelException e) {
} catch (IllegalAccessException e) {}
- 52 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Heureusement il est possible de rémédier à cela en modifiant la propriété swing.boldMetal, soit directement via la classe
UIManager :
Soit en passant par les variables systèmes si l'on n'a pas accès au code source :
Pour la touche ESCAPE c'est plus compliqué, une solution est d'associer du code à l'évènement (et non pas un bouton) :
rootPane.getActionMap().put(
"escPressed",
new AbstractAction("escPressed") {
public void actionPerformed(ActionEvent actionEvent) {
onKeyEscape();
}
});
}
...
- 53 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
La méthode "configureRootPane" ne devrait être appelée qu'une fois, par exemple juste après l'instanciation de votre
conteneur. Il vous reste à implémenter la méthode "onKeyEscape", qui sera appelée lors de chaque appui sur ESCAPE.
Component c = comboBox.getEditor().getEditorComponent() ;
JTextField textField = (JTextField) c ;
textField.addKeyListener( new KeyListener() ) ;
Comment changer la langue d'un JComponent sans changer la langue de tout le programme ?
Auteurs : Jack Huser ,
Il suffit d'utiliser la méthode setDefaultLocale de la classe JComponent.
Exemple, si j'ai un programme en français mais que je veux avoir tous mes JFileChooser en anglais :
JFileChooser.setDefaultLocale(new Locale("en","US"));
// ou JFileChooser.setDefaultLocale(Locale.US)
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
- 54 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
setEnabled(list.isEnabled());
setFont(list.getFont());
setOpaque(true);
return this;
}
}
Comment changer la langue de mon appllication et toutes les conversions qui vont avec ?
Auteurs : Jack Huser ,
Il suffit de changer le Locale de la JVM au démarrage.
Locale.setDefault(Locale.US);// par exemple si on est en français et que l'on veut l'anglais (USA)
ou
Locale.setDefault(new
Locale("en", "US"));// par exemple si on est en français et que l'on veut de l'anglais (USA)
En général:
Dans cet exemple, on aura donc les chiffre décimaux avec des points et non des virgules.
Nous allons prendre comme exemple la disposition de deux JLabels l'un au dessus de l'autre.
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
- 55 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
@SuppressWarnings("unchecked")
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
pack();
}
import javax.swing.JLabel;
import javax.swing.JPanel;
- 56 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
zpanel.setComponentZOrder(dessus, 0);
dessous = new JLabel("en dessous ! (et en partie masqué)");
dessous.setSize(dessous.getPreferredSize());
zpanel.setComponentZOrder(dessous, 1);
add(zpanel);
pack();
}
@SuppressWarnings("unchecked")
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
pack();
}
- 57 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Par exemple pour le JFileChooser vous pouvez dans votre code faire :
UIManager.put("FileChooser.saveButtonText","Enregistrer");
UIManager.put("FileChooser.openButtonText","Ouvrir");
UIManager.put("FileChooser.cancelButtonText","Annuler");
UIManager.put("FileChooser.updateButtonText","Actualiser");
UIManager.put("FileChooser.helpButtonText","Aide");
UIManager.put("FileChooser.saveButtonToolTipText","Enregistre le fichier");
Par contre, il n'existe pas de méthode toute faite pour se positionner de manière à voir tous les disques. Vous devrez
faire comme ceci :
• accept(File) : Cette méthode retourne un booléen indiquant si le fichier passé en paramètre est acceptable.
• getDescription() : Cette méthode retourne un String décrivant le filtre. C'est cette description qui sera affichée
dans le JFileChooser.
- 58 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
return nomFichier.endsWith(extension);
}
public String getDescription(){
return description;
}
}
Ce filtre simple ne prend en compte qu'une seule extension. Vous pouvez regarder les liens ci-dessous pour un exemple
de filtre "extensible" (capable de prendre en compte plusieurs extensions de fichiers).
Une dernière remarque : le filtrage ne se fait pas nécessairement sur une extension de fichier. Pour l'exemple on a choisi
cette possibilité car c'est ce qui est le plus couramment rencontré. Vous pouvez tout à fait faire des filtres sur les tailles
des fichiers, leurs dates de dernière modification, etc.
FiltreSimple.java
- 59 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
- 60 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
filtre.addExtension(".class");
chooser.showOpenDialog(null);
filtre.setDescription("Fichiers class");
filtre.removeExtension(".java");
chooser.showOpenDialog(null);
A noter que depuis Java 6.0, vous pouvez faire ceci de manière standard en utilisant la classe FileNameExtensionFilter,
qui permet de faire un filtre avec plusieurs extensions. Elle se crée de la manière suivante :
FiltreExtensible.java
Vous pouvez donc utiliser cet accessoire pour par exemple prévisualiser des images ou simplement pour avoir des
informations détaillées sur le fichier sélectionné. Voici un exemple de rendu (vous pouvez télécharger l'implémentation
ci-dessous) :
- 61 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
FilePreview.java
- 62 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
myJCC.setPreviewPanel(null);
- 63 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Le composant texte :
Il est également possible d'utiliser un javax.swing.JTextArea plus pratique à mettre en place que la version Html si le
texte n'est pas fixé dans le code... Cette solution est néanmoins plus contraignante sur la mise en page et sur la gestion
de l'apparence (par défaut le JTextArea n'a pas les mêmes couleurs qu'un JLabel).
(Un exemple est disponible en téléchargement)
La solution de la brute :
Empiler 2 ou 3 JLabel les uns au dessus des autres devrait faire l'affaire :-).
Comment permettre la saisie de mot de passe ? (texte saisi avec des étoiles)
Auteurs : Johann Heymes ,
Awt
Swing
- 64 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
txt.setEchoChar ('*')
La notion de modèle provient du design pattern MVC, Model-View-Controller Architecture, le but ici est donc de
modifier directement ce que peut contenir un composant texte en ignorant tout le reste. Pour se faire il suffit de créer
une classe qui dérive du modèle auquel le composant texte est associé. Pour information nous avons :
• JTextField et JTextArea : PlainDocument ;
• JEditorPane et JTextPane : DefaultStyledDocument.
Ces deux classes implémentent toutes deux l'interface javax.swing.text.Document qui définit entre autres la méthode
insertString(int, java.lang.String, javax.swing.text.AttributeSet) et remove(int, int). Il suffit donc de créer une classe
qui dérive de la classe modèle apropriée et de rédéfinir la ou les méthodes nécessaires. Notons que ces deux méthodes
insertString et remove seront appelées automatiquement par les classes de Sun à chaque ajout ou suppression de chaîne.
Notre redéfinition doit donc avoir pour but de valider ou non l'action. Par conséquent on notera que l'intégrité du
composant texte n'est jamais bafouée (voir démo ci-dessous.)
- 65 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
La classe JFormattedTextField possède un constructeur prenant en paramètre un Format. Cela permet de spécifer un
format au champ de saisie.
Un MaskFormatter convient aux motifs à taille fixe (n° de téléphone, n° de sécurité social, n° de série...).
On peut limiter les caractères valides en appelant l'une des méthodes suivantes : setValidCharacters(),
setInvalidCharacters().
Formatteurs personnalisés
Pour personnaliser un formatteur, il faut créer une classe dérivée de DefaultFormatter et redéfinir les méthodes
• String valueToString (Object value) throws ParseException
- 66 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
- 67 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
monTextArea.setCaretPosition(monTextArea.getDocument().getLength ());
On demande au JTextComponent de transmettre à son parent les coordonnées d'un point qui doit être visible.
try {
int longueur = monTextArea.getDocument().getLength();
Rectangle rectangle = monTextArea.modelToView(longueur);
monTextArea.scrollRectToVisible(rectangle);
} catch (javax.swing.text.BadLocationException err) {
- 68 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Exemple d'implémentation.
- 69 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Exemple d'implémentation.
maJTable.getTableHeader().setReorderingAllowed(false);
myJTable.getSelectionModel().addSelectionInterval(2,2);
myJTable.getSelectionModel().addSelectionInterval(4,5);
Pour ce qui est de sélectionner des cellules ou des zones de cellules de la JTable, la méthode changeSelection est plus
appropriée:
Comment définir l'alignement (gauche, centre, droite, ...) du contenu des colonnes d'une JTable ?
Auteurs : le y@m's ,
Il faut utiliser les méthodes setHorizontalAlignment() et setVerticalAlignment() de la classe DefaultTableCellRenderer
(ces méthodes sont en fait héritées de la classe JLabel).
- 70 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
On peut aussi faire de même pour les headers, cependant il vaut mieux récupérer le renderer par défaut et le modifier :
- Un header en particulier :
lien : JTree
- Pour construire un modèle d'arbre par défaut, il est nécessaire de passer le noeud racine (root).
- Il est possible d'y passer tout objet implémentant l'interface TreeNode. Vous pouvez aussi utiliser la classe par défaut
DefaultMutableTreeNode.
- Pour créer un noeud, il faut indiquer un objet utilisateur. L'arbre utilisera le résultat de la méthode toString pour
afficher une représentation de l'objet à un noeud donné. Pour un arbre représentant un système de fichiers, des objets
File pourront être utilisés.
- 71 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
// Construction de l'arbre.
JTree myTree = new JTree(myModel);
myTree.setShowsRootHandles(true);
myTree.setRootVisible(false);
- 72 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Deux autres solutions consistent à implémenter l'interface TreeCellRenderer ou bien à étendre la classe
DefaultTreeCellRenderer, permettant ainsi de modifier les icônes, la police et la couleur de fond des différents noeuds
de l'arbre.
myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
- 73 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Les « listeners » sont des interface. Ces interfaces fournissent une ou plusieurs méthodes qui peuvent donc être
implémentées différemment selon les cas et les besoins, pour répondre aux événements.
Les interfaces « listener » sont présentes principalement dans le package java.awt.event, mais également dans le package
javax.swing.event.
Chaque listener dispose d'une classe Event associée. Cette classe étend java.awt.event.EventObject et fournit une
description de l'évènement capturé. Par exemple, la classe ActionEvent décrit les évènements capturés par un
ActionListener.
Il y a plusieurs manières d'utiliser les listeners, vous trouverez ces méthodes dans les Q/Rs suivantes.
import java.awt.event.ActionListener;
public MaClasse() {
// Étape 4 : On ajoute « l'écouteur » sur le bouton « monBouton ».
monBouton.addActionListener(this);
// Puis sur monBouton2
monBouton2.addActionListener(this);
}
/
* Étape 2 :Cette méthode est déclarée dans l'interface ActionListener. Il nous faut l'implémenter. */
public void actionPerformed(ActionEvent e) {
// Étape 2bis
if(e.getSource() == monBouton) {
// Bouton 1 a été cliqué
}else {
// Bouton 2 a été cliqué
}
}
}
- 74 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Tout d'abord, à l'étape 1, nous déclarons une classe « MaClasse » qui implémente l'interface ActionListener (nous
l'étudierons plus en détail dans une autre Q/R). Puisque nous implémentons l'interface, nous devons également
implémenter toutes les méthodes définies dans l'interface.
À l'étape 4, nous ajoutons un « listener » sur les boutons précédemment créés. La méthode addActionListener est définie
dans la classe AbstractButton, classe parente de JButton. Cette méthode attend un paramètre de type ActionListener.
La classe MaClasse implémente cette interface, elle peut être justement considérée comme du type ActionListener. Nous
pouvons donc fournir l'opérateur 'this' en paramètre, qui représente l'instance en cours de la classe MaClasse.
Concrètement, qu'avons nous fait ? Nous avons demandé aux boutons monBouton et monBouton2 qu'ils nous
préviennent lorsqu'un utilisateur les actionne (c'est le rôle du « listener » ActionListener en particulier). Et comment ?
En utilisant la méthode actionPerformed, définie dans l'interface ActionListener et surchargée dans la classe MaClasse.
Nous avons deux boutons, mais une seule méthode actionPerformed. Nous devons donc différencier (étape 2bis) la
source de l'évenement, monBouton ou monBouton2.
Une deuxième possibilité est d'utiliser les classes anonymes. Voici quelques explications, toujours avec un code pour
l'exemple.
- 75 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Dès le début nous pouvons remarquer quelques différences avec la première méthode d'utilisation traitée
précédemment.
Tout d'abord notre classe MaClasse n'implémente pas l'interface ActionListener. Aucune instance de la classe MaClasse
ne pourra donc être utilisée dans la méthode addActionListener.
Nous créons deux boutons à l'étape 2. L'étape 3 est la plus intéressante. Nous définissons une instance de l'interface
ActionListener dans une classe anonyme, sans garder de référence vers cette classe anonyme. Dans ce cas, nous devons
le faire deux fois, une fois pour chaque bouton (il faut une classe anonyme pour chaque composant déclenchant un
évènement).
Un avantage de cette méthode est un code plus léger au niveau de l'implémentation des évènements. En effet, nous
n'avons pas à dissocier les composants « source » (les composants écoutés par le listener), comme nous le faisons dans
la première possibilité.
En contrepartie, nous devons créer une classe anonyme à chaque fois. Une autre possibilité qui est une simple variante
de celle présentée ici est la suivante :
monBouton.addActionListener(listener);
monBouton2.addActionListener(listener);
}
Ce code est fortement similaire au précédent et mérite donc peu d'explication. La seule subtilité est que nous «
sauvegardons » l'instance de la classe anonyme dans une variable, et que nous pouvons donc la réutiliser autant de fois
que nécessaire. Cependant, cette façon de faire nous oblige à différencier les composants « source » pour implémenter
un comportement différent selon la source.
// Fichier : MonListener.java
public class MonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
}
}
- 76 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
monButton.addActionListener(new MonListener());
Cette possibilité est très simple, il vous suffit d'implémenter le comportement voulu dans la classe qui implémente le
listener, puis, vous créez une instance de cette classe que vous passez en paramètre de la méthode addXXXListener
située dans votre classe où sont déclarés les composants (boutons, listes, etc).
Une seule méthode est déclarée dans cette interface : public void actionPerformed(java.awt.event.ActionEvent e).
La classe ActionEvent étend la classe java.util.EventObject, et hérite donc de ses méthodes. Parmi elles, getSource() est
particulièrement intéressante. Elle renvoie l'objet concerné par l'événement (par exemple le bouton qui a été cliqué).
Cela nous permettra de différencier les composants sources dans l'implémentation de la méthode actionPerformed.
La classe ActionEvent fournit quant à elle quelques méthodes spécifiques aux évènements d'action. Les plus utilisées
sont getWhen() et getActionCommand().
getWhen() récupère le timestamp Unix marquant le déclenchement de l'évènement, tandis que getActionCommand()
retourne le nom de la commande associée à l'évènement (par exemple, le texte du bouton à l'origine de l'action).
Voici une simple implémentation d'un ActionListener, utilisant la première méthode d'implémentation proposée :
[...]
import java.awt.event.*;
public MaClasse() {
// Étape 3 : on ajoute le listener aux boutons
monBouton.addActionListener(this);
monBouton.addActionListener(this);
}
- 77 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
}
}
Rien de nouveau aux étapes 1, 2, 3, et 4. Vous aurez compris que lorsque l'un des deux boutons est appuyé, la méthode
actionPerformed est invoquée.
Cependant, nous avons deux boutons, et un clic sur chacun d'eux invoquera la même implémentation de
l'ActionListener. Nous devons donc différencier le bouton source de l'action. Cela peut se réaliser de deux façons : soit on
compare le libellé du bouton avec celui de l'action capturée, soit on compare le bouton et l'objet source de l'évènement.
Les deux méthodes sont présentées à l'étape 5. Notez que mettre ces deux tests (comparaison de libellés et comparaison
de sources) dans une même condition est superflu, un seul des deux tests est nécessaire pour savoir quel bouton a été
actionné.
Trois méthodes sont déclarées dans l'interface du KeyListener : keyTyped(KeyEvent e), keyPressed(KeyEvent e) et
keyReleased(KeyEvent e). Elle permettent respectivement de réagir lorsqu'une touche a été : tapé (pressé puis relâché),
pressé, relâché.
La classe KeyEvent étend java.util.EventObject et dispose donc des méthodes déclarées dans cette classe (notamment
getSource() ), mais fournit également une dizaine d'autres méthodes spécifiques aux évènements relatifs au clavier.
Parmi elles : getKeyChar() retourne le caractère associé à la touche appuyée, getKeyCode() récupère le code de la touche
pressée, isActionKey() retourne true si la touche appuyée est une touche d'action (CAPS LOCK, Verr Num, etc), et
getKeyText(int keyCode) retourne le texte associée à la touche (par ex. F1, A, etc).
La dernière méthode, getKeyText, est statique, et ne s'utilise donc pas avec l'instance de KeyEvent fournie.
Les codes retournés par la méthode getKeyCode() sont utiles pour déterminer la touche pressée.
Tous les codes et leur correspondance sont disponible ici : http://java.sun.com/javase/6/docs/ap.../KeyEvent.html
Voici une simple implémentation d'un KeyListener, utilisant la première méthode d'implémentation proposée :
import java.awt.event.*;
public MaClasse() {
// Étape 3 : on ajoute le listener au composant
textField.addKeyListener(this);
}
- 78 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
/
* Cette méthode est appelée quand l'utilisateur appuie sur une touche Unicode (donc les caractères) et ne prend
System.out.println(e.getKeyChar());
}
Le code est assez explicite, et les commentaires précises quelques points obscures. Rien de nouveaux dans ce code, si ce
n'est la comparaison entre le code de la touche appuyé et le code de la touche Echap.
Enfin, sachez que si vous trouvez trop lourd de devoir implémenter les 3 méthodes alors qu'une seule vous suffit, il
existe la classe abstraite java.awt.event.KeyAdapter.
Vous pouvez soit créer une classe qui étendra KeyAdapter, soit faire une classe anonyme.
Exemple :
monTextField.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
}
});
5 méthodes sont déclarées dans l'interface MouseListener : mouseClicked(MouseEvent e) prévient des clics (la
souris a été pressée puis relâchée), mousePressed(MouseEvent e) pour les pressions sur la souris (donc on enfonce
le bouton sans le relâcher), mouseReleased(MouseEvent e) prévient du relâchement d'un bouton de la souris,
mouseEntered(MouseEvent e) indique que la souris est entrée dans l'espace d'un composant, mouseExited(MouseEvent
e) indique que la souris est sortie de l'espace d'un composant.
La classe MouseEvent étend java.util.EventObject et dispose donc des méthodes déclarées dans cette classe (notamment
getSource() ), mais fournit également 12 autres méthodes spécifiques aux événements relatifs à la souris, notamment
getButton() retourne le bouton qui a été cliqué, getClickCount() retourne le nombre de clics (utile pour gérer le double
clic), getLocationOnScreen() retourne un objet Point représentant la position de la souris à l'écran, et enfin
- 79 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
isPopupTrigger() précise si le bouton cliqué est celui habituellement utilisé pour afficher la liste déroulante (bouton
droit sur le bureau Windows par exemple).
Point p = e.getLocationOnScreen();
Il est fort probable que seules quelques unes de ces méthodes vous intéressent, il vous semblera donc lourd
d'implémenter chacune des méthodes..
Il existe donc une classe abstraite MouseAdapter qui vous permet d'implémenter seulement les méthodes qui vous
intéressent.
Exemple :
monPanel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
}
}
Cette interface déclare 7 méthodes : windowActivated(WindowEvent e) indique que la fenêtre a été activé,
windowDeactivated(WindowEvent e) indique que la fenêtre n'est plus la fenêtre active,windowClosed(WindowEvent
- 80 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
e) indique que la fenêtre a été fermé, windowClosing(WindowEvent e) indique que l'utilisateur a demandé
la fermeture de la fenêtre, windowOpened(WindowEvent e) est appelé la première fois que la fenêtre est
rendue visible, windowIconified(WindowEvent e) indique que la fenêtre a été réduite dans la barre de tâche,
windowDeiconified(WindowEvent e) indique que la fenêtre a été restauré depuis la barre de tâche.
La classe WindowEvent étend java.util.EventObject et dispose donc des méthodes déclarées dans cette classe
(notamment getSource() ), mais fournit également 5 autres méthodes spécifiques aux événements relatifs aux fenêtres,
notamment getNewState() et getOldState() qui fournissent respectivement le nouvel état et l'ancien état de la fenêtre,
mais aussi getWindow(), qui retourne la fenêtre source de l'événement.
Afin d'ajouter un WindowListener sur une fenêtre, vous disposez de la méthode addWindowListener(WindowListener)
de la classe Window (étendue par la classe JFrame notamment).
// [...]
public MaClass() {
maFenetre.addWindowListener(this);
}
Les méthodes sont nombreuses mais bien spécifiques. Il existe encore une fois une classe Adapter qui vous permet de
n'implémenter que les méthodes qui vous intéressent : WindowAdapter.
- 81 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Cette interface déclare 2 méthodes : focusGained(FocusEvent e) indique que le composant a gagné le focus clavier tandis
que focusLost(FocusEvent e) indique que le composant a perdu le focus clavier.
La classe FocusEvent étend java.util.EventObject et dispose donc des méthodes déclarées dans cette classe (notamment
getSource() ), mais fournit également 3 autres méthodes spécifiques aux événements relatifs aux fenêtres, notamment
isTemporary() qui indique si le composant n'a le focus que temporairement, et getOppositeComponent() qui retourne
l'autre composant impliqué dans le changement de focus.
Cette interface déclare une seule méthode : itemStateChanged(ItemEvent e) qui indique que l'élément a changé d'état.
La classe ItemEvent étend java.util.EventObject et dispose donc des méthodes déclarées dans cette classe (notamment
getSource() ), mais fournit également 4 autres méthodes spécifiques aux événements relatifs aux fenêtres, notamment
getItem() qui retourne l'élément affecté par l'évènement, getStateChange() retourne le nouvel état de l'élément
(sélectionné ou désélectionné), et getItemSelectable() qui retourne le composant originaire de l'évènement.
Afin d'ajouter un ItemListener sur les composants qui le permettent (les boutons, JcomboxBox, les listes, etc), vous
disposez de la méthode addItemListener(ItemListener).
// [...]
public MaFrame() {
choix = new JComboBox();
choix.addItemListener(this);
}
- 82 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
if(e.getStateChange() == ItemEvent.SELECTED) {
System.out.println("Un nouveau choix est sélectionné*: " + e.getItem().toString());
}else if(e.getStateChange() == ItemEvent.DESELECTED) {
System.out.println("*Un choix est désélectionné*: " + e.getItem().toString());
}
}
}
Nous effectuons un test afin de savoir l'état de l'élément affecté par l'évènement. En effet, deux états sont
possibles : ItemEvent.ITEM_SELECTED et ItemEvent.DESELECTED. Il faut bien comprendre que la méthode
itemStateChanged est invoquée deux fois : une fois pour l'élément qui vient d'être désélectionné et une fois pour celui
qui vient d'être sélectionné (ceci est vrai dans le cas d'une JComboBox par exemple). Il est donc important de faire la
différence, sous peine de voir son code exécuté deux fois.
- 83 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Exemple :
URL recup;
try {
/** récupère l'URL à partir du document courant et "page.html" */
recup = new URL(getDocumentBase(), "page.html");
/** Affiche le document après avoir recupérer le contexte courant */
getAppletContext().showDocument(recup, option_frame);
repaint();
} catch (MalformedURLException e) {
/** un traitement quelconque si la page n'est pas correcte */
}
Option_frame peut-être :
• "_self" -> la frame courant
• "_parent" -> la frame parente
• "_top" -> la frame de base
• "_blank" -> nouvelle fenetre
• "un_nom" -> nouvelle fenêtre nommée.
Comment récupérer des arguments d'une page HTML dans une applet ?
Auteurs : L'équipe Java ,
Code HTML :
- 84 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Code Java :
Dans l'applet on récupère les résultats ainsi :
Alors il suffit de récupérer une applet à partir d'une autre de cette manière :
class AppletDataBase {
/** Une structure de données permettant d'enregistrer les données */
static Hashtable data;
/** Une méthode permettant de récuperer une applet grâce à son tag */
public static Applet getApplet(String tag);
/** Une méthode chargée d'enregistrer une applet marquée par un tag */
public static void addApplet(Applet applet, String tag);
}
Dans les applets on peut ainsi faire l'équivalent de ce qui est fait avec l'AppletContext :
- 85 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
lien : http://www.suitable.com/docs/signing.html
try {
URL url = new URL("http://serveur.fr/monSon.au");
AudioClip ac = Applet.newAudioClip(url);
ac.play();
} catch( MalformedURLException e ) {
- 86 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
if(Desktop.isDesktopSupported(){
if(Desktop.getDesktop().isSupported(java.awt.Desktop.Action.MAIL){
try {
java.awt.Desktop.getDesktop().mail();
} catch (IOException ex) {
//Traitement de l'exception
}
} else {
//La fonction de mail n'est pas supportée par votre système d'exploitation
}
}else {
//Desktop pas supportée par votre système d'exploitation
}
Comme cette classe utilise des appels systèmes, il n'est pas possible de le faire sur tous les systèmes d'exploitations.
C'est pourquoi, il faut veiller à tester d'abord si les fonctions sont supportées par votre système d'exploitation avant
d'éviter des exceptions.
if(Desktop.isDesktopSupported(){
if(Desktop.getDesktop().isSupported(java.awt.Desktop.Action.MAIL){
try {
java.awt.Desktop.getDesktop().mail(new java.net.URI("mailto:nom@fai.ext"));
} catch (IOException ex) {
//Traitement de l'exception
}
} else {
//La fonction de mail n'est pas supportée par votre système d'exploitation
}
}else {
//Desktop pas supportée par votre système d'exploitation
}
Vous pouvez aussi spécifier les autres éléments du mailto selon la RFC 2368 (voir plus bas).
Comment ouvrir l'explorateur par défaut pour visualiser une page Web ?
Auteurs : Baptiste Wicht ,
Depuis Java 6, il y a une solution toute simple pour ouvrir l'explorateur par défaut à une page quelconque. Il vous faut
employer la classe java.awt.Desktop pour cela.
Par exemple, pour ouvrir l'explorateur par défaut sur le site Java de Developpez.com :
- 87 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
if(Desktop.isDesktopSupported(){
if(Desktop.getDesktop().isSupported(java.awt.Desktop.Action.BROWSE){
try {
java.awt.Desktop.getDesktop().browse(new URI("http://java.developpez.com"));
} catch (IOException ex) {
//Traitement de l'exception
} catch (URISyntaxException uri) {
//Traitement de l'exception
}
} else {
//La fonction n'est pas supportée par votre système d'exploitation
}
}else {
//Desktop pas supportée par votre système d'exploitation
}
Comme cette classe utilise des appels systèmes, il n'est pas possible de le faire sur tous les systèmes d'exploitations.
C'est pourquoi, il faut veiller à tester d'abord si les fonctions sont supportées par votre système d'exploitation avant
d'éviter des exceptions.
Par exemple, pour ouvrir un fichier (C:\\Test.pdf) avec le programme par défaut pour les PDF :
if(Desktop.isDesktopSupported(){
if(Desktop.getDesktop().isSupported(java.awt.Desktop.Action.OPEN){
try {
java.awt.Desktop.getDesktop().open(new File("C:\\Test.pdf"));
} catch (IOException ex) {
//Traitement de l'exception
}
} else {
//La fonction n'est pas supportée par votre système d'exploitation
}
}else {
//Desktop pas supportée par votre système d'exploitation
}
Comme cette classe utilise des appels systèmes, il n'est pas possible de le faire sur tous les systèmes d'exploitations.
C'est pourquoi, il faut veiller à tester d'abord si les fonctions sont supportées par votre système d'exploitation avant
d'éviter des exceptions.
- 88 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez
FAQ Java GUI
Par exemple, pour imprimer un fichier (C:\\Test.pdf) avec le programme par défaut pour les PDF :
if(Desktop.isDesktopSupported(){
if(Desktop.getDesktop().isSupported(java.awt.Desktop.Action.PRINT){
try {
java.awt.Desktop.getDesktop().print(new File("C:\\Test.pdf"));
} catch (IOException ex) {
//Traitement de l'exception
}
} else {
//La fonction n'est pas supportée par votre système d'exploitation
}
}else {
//Desktop pas supportée par votre système d'exploitation
}
Comme cette classe utilise des appels systèmes, il n'est pas possible de le faire sur tous les systèmes d'exploitations.
C'est pourquoi, il faut veiller à tester d'abord si les fonctions sont supportées par votre système d'exploitation avant
d'éviter des exceptions.
- 89 -
Les codes sources présentés sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre
intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : -
Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée
de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://
www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant
que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2004 - 2009 Developpez LLC : Tous droits réservés Developpez