FAQ Java GUIConsultez toutes les FAQ

Nombre d'auteurs : 51, nombre de questions : 152, dernière mise à jour : 29 juin 2013 

 
OuvrirSommaireDivers et astuces

Les 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).

 
Sélectionnez
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.

 
Sélectionnez
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”.
Créé le 21 décembre 2009  par bouye

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 :

 
Sélectionnez
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 :

 
Sélectionnez
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).

Créé le 26 mai 2007  par Orian, Baptiste Wicht

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 :

 
Sélectionnez
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.

Mis à jour le 12 janvier 2008  par Baptiste Wicht

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 :

 
Sélectionnez
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.

Créé le 26 mai 2007  par Baptiste Wicht

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 :

 
Sélectionnez
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.

Créé le 26 mai 2007  par Baptiste Wicht

Lien : Classe DesktopClasse Desktop

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 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.