
FAQ Java GUIConsultez toutes les FAQ
Nombre d'auteurs : 51, nombre de questions : 152, dernière mise à jour : 21 décembre 2009
Sommaire→Divers et astucesLes composant AWT sont dits heavyweight ou composants lourds tandis que les composants Swing sont dits lightweight ou composants légers.
Précédemment lorsqu'on mélangeant de tels composants le composant heavyweight s'affichait toujours par dessus les autres composants lightweight. Il était possible d'appeler les méthodes setDefaultLightWeightPopupEnabled() et setLightWeightPopupEnabled() des classes JPopupMenu et JComboBox pour pallier à certains défauts de superposition mais cela ne réglait pas tous les problèmes. Depuis Java 6 update 12 et le JDK 7 build 19 (préversion du JDK 7), il est possible de mélanger des composants Swing avec des composants AWT sans avoir les composants AWT qui s'affichent tout le temps au-dessus des composant Swing.
Les restrictions suivantes s'appliquent cependant :
1. Suite à un bug dans Swing (6852592), il faut absolument revalider la hiérarchie des composants dès que celle-ci devient invalide. Il ne faut pas simplement appeler revalidate() sur le composant mais également appeler validate() sur un conteneur parent (la JFrame par exemple).
monComposant.revalidate();
maFrame.validate();
Lorsque ce bug aura été corrigé ce workaround pourra être retiré de votre code.
2. Lorsqu'un composant heavyweight doit être ajouté dans un JScrollPane, il faut mettre son scroll mode à la valeur SIMPLE_SCROLL_MODE. Les autres modes de scroll ne sont pas supportés car ils sont optimisés uniquement pour des composants ligthweight.
monScrollPane.setScrollMode(JScrollPane. SIMPLE_SCROLL_MODE) ;
3. En cas de superposition de composants lightweight non-rectangulaires par-dessus un composant heavyweight, il vous faut utiliser la méthode setComponentMixingCutoutShape() de la classe com.sun.awt.AWTUtilities de manière à définir la forme (Shape) utilisée par le composant lightweight. Si vous ne le faites pas, le composant lightweight sera traité comme ayant une surface rectangulaire et donc le composant heavyweight qui se trouve sous lui ne s'affichera correctement.
Cette méthode ne faisant pas partie de l'API publique, elle peut changer ou être retirée dans les futures versions de Java. Il est également possible qu'elle soit déplacée dans une autre classe dans la version finale du JDK 7. Sun recommande d'utiliser la réflexion pour l'invoquer mais vous pouvez également utiliser l'API AWTUtilities d'adiGuba.
Il existe également des limitations :
- La superposition de composants lightweight semi-transparents par-dessus un composant heavyweight n'est pas supportée : la partie du composant heavyweight située sous le composant lightweight ne s'affichera pas.
- Les composants heavyweight doivent appartenir au même processus que celui qui a crée la frame ou l'applet contenant les composants lightweight.
- La gestion avancée des évènements Swing telle que ceux se basant sur InputMap peut ne pas fonctionner correctement en cas de mélange de composants lightweight et heavyweight.
- Si vos applications mélangent déjà des composants AWT et Swing et qu'elles ne se comportent plus correctement une fois passées à des versions plus récentes de Java, il est possible de désactiver cette fonctionnalité en mettant la propriété système sun.awt.disableMixing à la valeur “false”.
Depuis Java 6, il y a une solution toute simple pour ouvrir la fenêtre d'édition de courrier du programme par défaut. Il vous faut employer la classe java.awt.Desktop pour cela.
Pour ouvrir simplement la fenêtre pour un nouveau mail :
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.
Vous pouvez aussi spécifier une adresse de destination :
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).
Lien : Classe DesktopClasse Desktop
Lien : The mailto URL scheme (RFC 2368)The mailto URL scheme (RFC 2368)
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 :
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.
Lien : Classe DesktopClasse Desktop
Depuis Java 6, il y a une solution toute simple pour ouvrir un fichier avec le programme par défaut pour ce type de fichier. Il vous faut employer la classe java.awt.Desktop pour cela.
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.
Lien : Classe DesktopClasse Desktop
Depuis Java 6, il y a une solution toute simple pour imprimer un fichier avec le programme par défaut pour ce type de fichier. Il vous faut employer la classe java.awt.Desktop pour cela.
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.
Lien : Classe DesktopClasse Desktop

















