FAQ Java GUIConsultez toutes les FAQ

Nombre d'auteurs : 37, nombre de questions : 155, dernière mise à jour : 10 octobre 2015  Ajouter une question

 

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


SommaireDivers et astuces (6)
précédent sommaire
 

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élangeait 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).

Code java : Sélectionner tout
1
2
monComposant.revalidate(); 
maFrame.validate();
Lorsque ce bug aura été corrigé, ce contournement 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.

Code java : Sélectionner tout
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 pas 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éé 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”.

Mis à jour le 21 décembre 2009 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 :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
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 :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
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é par votre système d'exploitation 
}
Vous pouvez aussi spécifier les autres éléments du mailto selon la RFC 2368 (voir plus bas).

Mis à jour le 26 mai 2007 Baptiste Wicht Orian

Classe Desktop
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 :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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é 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 26 mai 2007 Baptiste Wicht

Classe 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 :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
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é 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 26 mai 2007 Baptiste Wicht

Classe 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 :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
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é 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 26 mai 2007 Baptiste Wicht

Classe Desktop

Depuis Java SE 6, il est possible de placer des icônes dans le "system tray" du bureau. Toutefois cette fonctionnalité étant fortement dépendante du système d'exploitation et de son bureau, elle n'est pas forcément supporté dans tous les cas.

Voici un exemple de code permettant d'ajouter une icône dans le "systray" :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	// On vérifie que le "systray" est supporté 
	// par la JVM pour ce système d'exploitation 
	if (SystemTray.isSupported()) { 
  
  
		// On Crée un TrayIcon qui représentera notre icône : 
		TrayIcon trayIcon = new TrayIcon( 
				image,		// L'image qui sera utilisé comme icône 
				tooltip, 	// Le texte affiché lors du survol de la souris 
				popup		// Le PopupMenu qui s'affichera lors du clic droit 
				); 
  
		// On active le redimensionnement automatique de 
		// l'icône, afin qu'elle s'adapte au système 
		// (sinon l'icône peut être tronqué ou disproportionné) 
		trayIcon.setImageAutoSize(true); 
  
		// On récupère l'instance du SystemTray 
		SystemTray systemTray = SystemTray.getSystemTray(); 
  
		// Et on ajoute notre TrayIcon dans le system tray 
		systemTray.add(trayIcon); 
	}
A noter qu'une fois que l'icône est présente dans le systray, on peut l'utiliser pour afficher une infobulle :

Code java : Sélectionner tout
1
2
3
4
5
trayIcon.displayMessage( 
			"Titre",			// Titre de la bulle 
			"Message",			// Contenu du message  
			MessageType.INFO	// Style de l'icone 
		);
Pour les versions antérieurs à Java SE 6, plusieurs API (plus ou moins portables), utilisant JNI, existent pour pallier à ce manque :

  • SysTray for Java : fonctionne sur les systèmes Windows et KDE.
  • JDIC (JDesktop Integration Components) : fonctionne sous Windows, Linux et Solaris

Mis à jour le 10 octobre 2015 adiGuba Ioan

Les classes Desktop et SystemTray, des alternatives à JDIC, par Baptiste Wicht

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2016 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsable bénévole de la rubrique Java : Mickael Baron -