IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

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.

SommaireAWT et SwingG�n�ralit�s (27)
pr�c�dent sommaire suivant
 

Tout d'abord, il faut rappeler que la librairie AWT a �t� d�velopp�e pour la premi�re sortie de Java version 1.0 du JDK alors que Swing n'est apparue qu'� la version 1.2 du JDK (soit Java 2). Il en r�sulte donc des diff�rences fondamentales de conception entre les deux librairies.

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 performances 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�cessaire de les ajouter � un volet de contenu (cf : javax.swing.JRootPane). De mani�re plus explicite, je veux parler du :

Code java : S�lectionner tout
jframe.getContentPane().add(monComposant);
Voil�, 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-m�me en suspens... Peut-on m�langer Awt et Swing ?

Mis � jour le 9 mai 2002 Johann.Heymes

NON ! Il est impossible d'obtenir un rendu graphique correct dans une application qui m�lange AWT et SWING. Des probl�mes de superposition emp�chent toute collaboration.

Explication : avant toute chose, il faut bien comprendre les diff�rences entre Awt et Swing : Quelles 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 couches (instance de JLayeredPane) et un volet structur� en pellicules (GlassPane).



  • Le composant LayeredPane permet d'ins�rer une barre de menus 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 composants).
  • 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 :

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
24
25
import javax.swing.*; 
import java.awt.*; 
  
public class AWTSwing { 
        private JComboBox combo; // Composant Swing 
        private Button bouton; // Composant AWT 
  
        public AWTSwing () { 
                JFrame frame = new JFrame ("Peut-on melanger Awt & Swing ?"); 
                frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
                frame.setBounds (300, 300, 200, 300); 
  
                String [] a = {"oui", "non", "peut etre"}; 
                combo = new JComboBox (a); 
                frame.getContentPane ().add (combo, BorderLayout.NORTH); 
                bouton = new Button ("Coucou"); 
                frame.getContentPane ().add (bouton, BorderLayout.CENTER); 
  
                frame.setVisible (true); 
        }  
  
        public static void main (String argv []) { 
                new AWTSwing (); 
        }  
}
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).

La seule solution envisageable est d'uniformiser le code sur la librairie graphique utilis�e, soit tout AWT, soit tout Swing !

Mis � jour le 9 mai 2002 Johann.Heymes

On peut utiliser la classe java.lang.Thread ou impl�menter l'interface java.lang.Runnable, mais suivant les cas de figure cela repr�sente beaucoup de code et de contraintes. En effet, les instructions qui affectent ou d�pendent d'un composant graphique Swing doivent �tre effectu�es par le processus d'�v�nement (the event-dispatching thread). Par cons�quent, si l'on utilise la classe Thread ou l'interface Runnable, il est n�cessaire d'utiliser les m�thodes : invokeLater(java.lang.Runnable) ou invokeAndWait(java.lang.Runnable) javax.swing.SwingUtilities.

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 milliseconde). 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 :

Code java : S�lectionner tout
1
2
3
4
public Timer (int delay, ActionListener listener); 
/** delay = l'intervalle de temps entre chaque �v�nement. 
 * listener = l'objet �couteur de ces �v�nements. 
 */
m�thode permettant de lancer le processus :

Code java : S�lectionner tout
public void start();
m�thode permettant de stopper le processus :

Code java : S�lectionner tout
public void stop();
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...

Mis � jour le 24 mars 2002 Johann.Heymes

JDK 1.3 et inf�rieur : lorsque l'on utilise la m�thode show(java.awt.Component, int, int) pour afficher un javax.swing.JPopupMenu, les coordonn�es correspondent au coin haut-gauche du menu. Si ces coordonn�es sont trop pr�s du bord de l'�cran, une partie du menu est alors cach�e. Nous allons donc surcharger la m�thode show() pour que les coordonn�es soient corrig�es si le message est trop proche du bord de l'�cran.

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
24
class MonPopupMenu extends JPopupMenu { 
        public void show(Component invoker, int x, int y) { 
                /**Dimension de l'�cran */ 
                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
                /** Dimension du Menu popup */ 
                Dimension popupSize = this.getPreferredSize(); 
                /** Position en x,y du popup � l'�cran (pour le .show) */ 
                double xPopupEcran = invoker.getLocationOnScreen().getX() + x; 
                double yPopupEcran = invoker.getLocationOnScreen().getY() + y; 
  
                /** Si le popup d�borde de l'�cran sur la droite on d�cale sur x */ 
                if ((xPopupEcran + popupSize.getWidth()) > screenSize.getWidth()) { 
                        x = x - (int)popupSize.getWidth(); 
                }  
  
                /** Si le popup d�borde de l'�cran sur le bas on d�cale sur y */ 
                if ((yPopupEcran + popupSize.getHeight()) > screenSize.getHeight()) { 
                        y = y - (int)popupSize.getHeight(); 
                }  
  
                /** On affiche le popup � l'endroit judicieusement calcul� :) */ 
                super.show(invoker, x, y); 
        }  
}
JDK 1.4 : ce bug a �t� r�solu dans la version 1.4 de l'API. Le correctif n'est pas n�cessaire.

Mis � jour le 1er janvier 2004 Clement Cunin

Ce n'est pas directement possible en AWT, il faut cr�er sa propre classe MyButton permettant de le faire en d�rivant, par exemple, Component pour faire un lightweigth component.

Mis � jour le 1er avril 2002

Il y a un constructeur de JButton et une m�thode qui permettent d'avoir le r�sultat voulu en donnant l'image en argument sous forme de Icon

Code sql : S�lectionner tout
JButton bouton = new JButton(new ImageIcon("images/bouton.gif"));
ou

Code sql : S�lectionner tout
bouton.setIcon(new ImageIcon("images/bouton.gif"));

Mis � jour le 3 f�vrier 2007 Strab

La classe AbstractButton d�finit un ensemble de m�thodes permettant d'indiquer comment doit se dessiner le bouton. Ainsi, on peut indiquer, par exemple, si on d�sire dessiner les rebords ou le contenu. Voici un exemple.

Le code ci-dessous dessine un bouton transparent, seul le texte sera affich� en rouge.

Code java : S�lectionner tout
1
2
3
4
5
JButton printButton = new JButton("Imprimer"); 
printButton.setForeground(Color.red); 
printButton.setFocusPainted(false); 
printButton.setBorderPainted(false); 
printButton.setContentAreaFilled(false);

Mis � jour le 12 ao�t 2004 bulbo

Voil� un d�but de code permettant d'imprimer un Container 'cont'.

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
/** R�cup�re le travail et affiche la boite de dialogue d'impression */ 
PrintJob job = getToolkit().getPrintJob(frame_parent_pour_le_dialogue,"essai", null); 
if (job != null) { 
        /** R�cup�re le Graphics dans lequel on va �crire */ 
        Graphics g = job.getGraphics(); 
        if (g != null) { 
                /** Sur le Container imprime l'ensemble de ses Components  */ 
                cont.printAll(g); 
                g.dispose(); 
        }  
        /** Finit le travail  */ 
        job.end(); 
}

Mis � jour le 2 avril 2002

Pour enregistrer un object de type Component en tant qu'image, il faut commencer par dessiner ce composant dans une BufferedImage puis on va �crire cette image dans un fichier.

Voici un exemple qui permet d'enregistrer un composant sous forme d'image JPeg :

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
24
public void saveImage(Component component, File destination){ 
	BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB); 
  
	Graphics2D g2d = image.createGraphics(); 
  
	if(!component.isOpaque()){ 
		Color bg = component.getBackground(); 
		bg = (bg.getAlpha() < 255) ? new Color(bg.getRed(), bg.getGreen(), bg.getBlue()) : bg; 
  
		Color color = g2d.getColor(); 
		g2d.setColor(bg); 
		g2d.fillRect(0, 0, component.getWidth(), component.getHeight()); 
		g2d.setColor(color); 
	} 
  
	component.paint(g2d); 
	g2d.dispose(); 
  
	try { 
		ImageIO.write(image, "jpeg", destination); 
	} catch (IOException e) {       
		e.printStackTrace(); 
	}  
}

Mis � jour le 26 mai 2007 Baptiste Wicht fxjtarga

Sympt�mes :
La fen�tre est vide, ou il est impossible de cliquer sur le moindre composant, ou les autres fen�tres du syst�me d'exploitation laissent des tra�n�es grises qui ne se redessinent par sur vos fen�tres, ou encore j'ai l'impression que mon application met du temps � r�agir.

Cause :
Ce probl�me est tr�s classique lors d'un long traitement dans une application graphique. En Java, un Thread est charg� de toutes les op�rations li�es � l'affichage et � la gestion des �v�nements, le Thread "Event Dispatching Thread" (en abr�g� EDT). Si une application utilise ce Thread pour faire un traitement de plusieurs minutes, c'est autant de temps o� l'application ne sera plus r�active aux actions de l'utilisateur, ni aux mises � jour graphiques (d'une barre de progression par exemple). Typiquement, vous avez du code li� au clic sur un bouton ou un menu (un ActionListener par exemple) et vous y effectuez de gros calculs ou des Thread.sleep(). Vous ne pouvez pas faire �a, les traitements de l'EDT doivent �tre le plus bref possible !

Solution :
La solution est assez simple � comprendre : tout traitement long doit �tre effectu� par un autre Thread. En Java 5 et sup�rieur, la classe SwingWorker est tr�s utile pour vous aider � faire �a.

Mis � jour le 22 mars 2002 Clement Cunin tchize_

L'Event Dispatch Thread, �galement appel�e EDT, est le Thread dans lequelle l'AWT et Swing font � la fois leur affichage et leur propagation d'�v�nements. Les composants AWT et Swing doivent uniquement �tre utilis�s dans l'EDT. Si un composant est instanci�, appel� et manipul� depuis un autre Thread, il peut potentiellement provoquer une erreur dans le programme ou ne pas s'afficher correctement.

L'EDT alterne les cycles d'affichage et les cycles de propagation d'�v�nements. Ainsi, quand on g�re un �v�nement clavier, souris ou de s�lection dans un composant, on est assur� que :

  • On est bien dans l'EDT.
  • Le composant n'est pas en train de se redessiner. Il sera redessin� dans un cycle d'affichage ult�rieur (pas forc�ment le cycle suivant) si on appelle sa m�thode repaint() apr�s le traitement de l'�v�nement. Il existe cependant des mani�res d'avoir un rendu imm�diat lorsque l'�tat d'un composant est modifi�, mais g�n�ralement vous ne devriez pas avoir besoin de les utiliser.

Mis � jour le 6 juin 2009 bouye

Les deux mani�res de v�rifier que le traitement actuel se d�roule bien dans l'EDT sont :

  • pour l'AWT, d'invoquer la m�thode statique isDispatchThread() de la classe java.awt.EventQueue.
  • Pour Swing, d'invoquer la m�thode statique isEventDispatchThread() de la classe javax.swing.SwingUtilities.

Mis � jour le 6 juin 2009 bouye

Tout d'abord, il est bien important de comprendre que tout traitement d'�v�nement, tels que des �couteurs pour le clavier, la souris ou de s�lections dans des composants, et impl�ment� de mani�re standard se d�roule d�j� dans l'EDT.

Cependant, il peut parfois �tre n�cessaire d'effectuer un traitement "plus tard" de mani�re � essayer d'attendre un moment o� le niveau de charge de l'EDT est moins �lev� ou pour laisser le temps � l'interface graphique de faire un affichage pr�liminaire par exemple. Pour ce faire, il faut appeler la m�thode statique invokeLater() de la classe javax.swing.SwingUtilities. Cette m�thode rend imm�diatement la main apr�s avoir �t� invoqu�e.

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
// Cette m�thode retourne imm�diatement. 
SwingUtilities.invokeLater(new Runnable() { 
  /** 
   * {@inheritDoc} 
   */ 
  @Override public void run() { 
      myButton.setText("Salut le monde !") ; 
  } 
}) ;
Les traitements longs doivent, quant � eux, �tre ex�cut�s dans un autre Thread, car ils sont susceptibles de bloquer l'EDT et de rendre votre application lente, voire de faire que votre interface graphique ne se r�-affiche plus.

Mis � jour le 6 juin 2009 bouye

Les traitements longs doivent �tre lanc�s hors de l'EDT, pour cela il est possible d'utiliser un autre Thread que l'on lance manuellement ou encore d'utiliser un java.util.Timer.

Attention cependant � penser � v�rifier et au besoin � changer la priorit� du nouveau Thread, car cette derni�re h�rite automatiquement sa priorit� de celle de son Thread parent dans laquelle elle a �t� cr��e (le nouveau Thread a donc la m�me priorit� que l'EDT).

Pour Java 6 ou plus, il est recommand� d'utiliser la classe javax.swing.SwingWorker qui offre un framework permettant d'ex�cuter une t�che hors de l'EDT, tout en r�cup�rant ses r�sultats interm�diaires et finaux dans l'EDT. Une impl�mentation existe pour Java 5 qui est disponible chez SwingLabs.

Mis � jour le 6 juin 2009 bouye tchize_

Il existe deux fa�ons de faire :

  • Utiliser la m�thode statique invokeLater() de la classe javax.swing.SwingUtilities. Cette m�thode prend en param�tre une instance de la classe Runnable qui sera ex�cut�e ult�rieurement. Cette m�thode retourne imm�diatement apr�s avoir �t� invoqu�e.

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
// Cette m�thode retourne imm�diatement.  
SwingUtilities.invokeLater( 
	new Runnable() {  
		/**  
                 * {@inheritDoc}  
                 */  
		@Override public void run() {  
		    myButton.setText("Salut le monde !") ;  
		}  
	}) ;
  • Utiliser la m�thode statique invokeAndWait() de la classe javax.swing.SwingUtilities. Cette m�thode prend en param�tre une instance de la classe Runnable qui sera ex�cut�e. Cette m�thode bloque tant que l'action n'a pas �t� effectu�e, ce qui permet, par exemple, de mettre � jour l'interface graphique quand on effectue un traitement depuis un autre Thread et de bloquer jusqu'� ce que la GUI ait �t� modifi�e. Cette m�thode ne DOIT PAS �tre appel�e de l'EDT m�me.

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
// Cette m�thode bloque tant que le traitement EDT n'est pas effectu�.  
SwingUtilities.invokeAndWait( 
	new Runnable() {  
		/**  
                 * {@inheritDoc}  
                 */  
		@Override public void run() {  
		    myButton.setText("Salut le monde !") ;  
		 }  
	});
Attention cependant, si elle est mal utilis�e, invokeAndWait() peut provoquer des deadlocks ; il est donc recommand� d'utiliser la classe javax.swing.SwingWorker � la place.

Mis � jour le 6 juin 2009 bouye

Pour mieux comprendre le probl�me : Lors d'un traitement long, l'affichage se fige, que faire ?

Voici deux codes sources Java comment�s.
JProgress : la mauvaise m�thode (la v�tre ?)
JProgress2 = une solution

Mis � jour le 5 juin 2002 Johann.Heymes

Pour faire cela, il faut utiliser la classe UIManager. Par exemple :

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
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).

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
JFrame frame = new JFrame(); 
frame.setVisible(true); 
// etc. 
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) {}

Mis � jour le 12 ao�t 2004 Ioan

Les Look and Feel enregistr�s sont disponibles avec la m�thode getInstalledLookAndFeels de la classe UIManager. Voici un exemple r�cup�rant l'ensemble des Look and Feel sous forme de Map, dont les clefs sont les noms des L&F et les valeurs les noms des classes correspondantes.

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
public Map getLookAndFeelsMap(){ 
   UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels(); 
   Map map = new TreeMap(); 
   for(int i=0; i<info.length;i++){ 
      String nomLF = info[i].getName(); 
      String nomClasse = info[i].getClassName(); 
      map.put(nomLF,nomClasse);  
   } 
   return map; 
}
Pour un exemple utilisant cette m�thode, regardez le fichier ci-dessous.

Mis � jour le 12 ao�t 2004 Ioan

Avant tout affichage, il faut appeler la m�thode put(Object, Object) de la classe UIManager. Le premier param�tre correspond � l'objet � modifier, et le second est la valeur � lui donner.

Par exemple, pour mettre en blanc le fond de tous les JPanels :

Code java : S�lectionner tout
UIManager.put("Panel.background", new ColorUIResource(Color.WHITE));

Mis � jour le 12 janvier 2008 CheryBen

Metal, le Look and Feel par d�faut, utilise du texte en gras dans la plupart des composants Swing. Le r�sultat n'est pas forc�ment des plus esth�tiques.

Heureusement, il est possible de rem�dier � cela en modifiant la propri�t� swing.boldMetal, soit directement via la classe UIManager :

Code java : S�lectionner tout
1
2
// Ne pas utiliser de texte en gras (LnF Metal) : 
UIManager.put("swing.boldMetal", Boolean.FALSE);

Soit en passant par les variables syst�mes si l'on n'a pas acc�s au code source :

Code : S�lectionner tout
java -Dswing.boldMetal=false ... (les autres param�tres standards)

Mis � jour le 20 octobre 2006 adiGuba

Vous souhaitez associer des boutons de votre interface graphique aux touches ENTER et ESCAPE, et ceci quel que soit le composant qui ait le focus lors de l'appui sur ces touches ?

Pour la touche ENTER, c'est tr�s simple parce que c'est fait pour :

Code java : S�lectionner tout
1
2
3
4
  // - pour une JFrame 
  maFrame.getRootPane().setDefaultButton(monBouton) 
  // - pour une JDialog 
  monDialog.getRootPane().setDefaultButton(monBouton)
Pour la touche ESCAPE, c'est plus compliqu�. Une solution est d'associer du code � l'�v�nement (et non pas un bouton) :

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  private void configureRootPane(JRootPane rootPane) { 
    InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "escPressed"); 
  
    rootPane.getActionMap().put( 
        "escPressed", 
        new AbstractAction("escPressed") { 
          public void actionPerformed(ActionEvent actionEvent) { 
            onKeyEscape(); 
          } 
        }); 
  } 
  
  ... 
  
  // - pour une JFrame 
  configureRootPane(maFrame.getRootPane()); 
  // - pour une JDialog 
  configureRootPane(monDialog.getRootPane());
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.

Mis � jour le 3 avril 2005 laffreuxthomas

Il faut en fait ajouter le KeyListener au composant permettant l'�dition de la combobox, en l'occurrence un JTextField :

Code java : S�lectionner tout
1
2
3
Component c = comboBox.getEditor().getEditorComponent() ; 
JTextField textField = (JTextField) c ; 
textField.addKeyListener( new KeyListener() ) ;

Mis � jour le 16 d�cembre 2006 wammaster

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 :

Code java : S�lectionner tout
1
2
JFileChooser.setDefaultLocale(new Locale("en","US")); 
// ou JFileChooser.setDefaultLocale(Locale.US)

Mis � jour le 26 mai 2007 Jack Huser

Pour changer l'arri�re-plan de certaines lignes d'une Jlist, il faut utiliser un ListCellRenderer personnalis� :

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
24
25
26
27
28
29
30
31
32
class MyCellRenderer extends JLabel implements ListCellRenderer { 
  
	public Component getListCellRendererComponent( 
		JList list, 
		Object value,            // value to display 
		int index,               // cell index 
		boolean isSelected,      // is the cell selected 
		boolean cellHasFocus)    // the list and the cell have the focus 
	{ 
		setText(value.toString()); 
  
		if (isSelected) { 
			setBackground(list.getSelectionBackground()); 
			setForeground(list.getSelectionForeground()); 
		} 
		else { 
			setBackground(list.getBackground()); 
			setForeground(list.getForeground()); 
		} 
  
		// Ici, il faut tester si on veut changer la couleur et changer par la  
		// couleur de notre choix 
		if (taCondition == true){ 
			setBackground(couleur); 
		} 
  
		setEnabled(list.isEnabled()); 
		setFont(list.getFont()); 
		setOpaque(true); 
		return this; 
	} 
}

Apr�s, il suffit d'appliquer ce renderer � la JList :

Code java : S�lectionner tout
1
2
JList list = new JList(); 
list.setCellRenderer(new MyCellRenderer());

et le tour est jou�.

Mis � jour le 26 mai 2007 Baptiste Wicht seiryujay

Il suffit de changer le Locale de la JVM au d�marrage.

Code java : S�lectionner tout
Locale.setDefault(Locale.US);// par exemple si on est en fran�ais et que l'on veut l'anglais (USA)
ou

Code java : S�lectionner tout
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:

Code : S�lectionner tout
Locale loc = new Locale(String langue, String pays)
Dans cet exemple, on aura donc les chiffres d�cimaux avec des points et non des virgules.

Mis � jour le 12 janvier 2008 Jack Huser

Il y a deux mani�res de faire pour disposer ses composants en couches ou en niveaux :

  • En utilisant un JLayeredPane. Cette solution est utilisable avec Swing.
  • En utilisant le principe du ZOrder. Cette solution est valable pour AWT et Swing, pour toutes les classes descendant de Container.

Nous allons prendre comme exemple la disposition de deux JLabels l'un au dessus de l'autre.

Premi�rement, avec un JLayeredPane :

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
  
public class CouchesAvecJLayer extends javax.swing.JFrame { 
    public CouchesAvecJLayer() { 
        initComponents(); 
    } 
  
    private void placeLesCouches(){ 
        JLayeredPane layered; 
        JLabel dessous; 
        JLabel dessus; 
  
        layered = new JLayeredPane(); 
        // Comme il n'y a pas vraiment de layout avec un JLayeredPane 
        // il faut g�rer soi-m�me les tailles et positions. 
        layered.setPreferredSize(new java.awt.Dimension(400, 200)); 
        // (pour simplifier on ne g�re pas les positions, tout ira les 
        // uns sur les autres). 
  
        dessous = new JLabel("en dessous ! (et en partie masqu�)"); 
        dessous.setSize(dessous.getPreferredSize()); 
        layered.add(dessous, new Integer(0)); 
        dessus = new JLabel("au dessus !"); 
  
        // Inutile, pour jouer avec l'opacit� de fa�on � mieux faire 
        // appara�tre ce qui est dessus/dessous 
        dessus.setOpaque(true); 
  
        layered.add(dessus, new Integer(1)); 
        add(layered); 
        pack(); 
    } 
  
  	@SuppressWarnings("unchecked") 
  	private void initComponents() { 
    	setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
  
    	pack(); 
  	}                         
  
    public static void main(String args[]) { 
        java.awt.EventQueue.invokeLater(new Runnable() { 
            public void run() { 
                CouchesAvecJLayer couches; 
  
                couches = new CouchesAvecJLayer(); 
                couches.placeLesCouches(); 
                couches.setVisible(true); 
            } 
        }); 
    } 
}
Puis en jouant avec le ZOrder des composants :

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import javax.swing.JLabel; 
import javax.swing.JPanel; 
  
public class CouchesAvecZOrder extends javax.swing.JFrame { 
    public CouchesAvecZOrder() { 
        initComponents(); 
    } 
  
    private void placeLesCouches(){ 
        JPanel zpanel; 
        JLabel dessous; 
        JLabel dessus; 
  
        zpanel = new JPanel(); 
  
        // Le r�glage du layout est particulier avec le ZOrder. 
        // Pour simplifier on le supprime. 
        zpanel.setLayout(null); 
  
        zpanel.setPreferredSize(new java.awt.Dimension(400, 200)); 
        dessus = new JLabel("au dessus !"); 
  
        // Comme il n'y a plus de layout on doit g�rer les tailles. 
        dessus.setSize(dessus.getPreferredSize()); 
  
        // Inutile, pour jouer avec l'opacit� de fa�on � mieux faire 
        // appara�tre ce qui est dessus/dessous 
        dessus.setOpaque(true); 
  
        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(); 
  	}                         
  
    public static void main(String args[]) { 
        java.awt.EventQueue.invokeLater(new Runnable() { 
            public void run() { 
                CouchesAvecZOrder couches; 
  
                couches = new CouchesAvecZOrder(); 
                couches.placeLesCouches(); 
                couches.setVisible(true); 
            } 
        }); 
    } 
}

Mis � jour le 15 novembre 2008 gifffftane

Ce n'est pas possible.

Pour obtenir un r�sultat similaire, il faut utiliser la notion de mod�le, souvent attach�e � un composant swing (JTable, JTree...). Le mod�le Action est le plus simple, et permet de stipuler une m�me fonction � plusieurs boutons, ou autre composant. Il s'utilise simplement par l'AbstractAction.

Pour cr�er une AbstractAction :

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
class QuelleBelleAction extends javax.swing.AbstractAction 
  { 
    QuelleBelleAction() 
    { 
      putValue(NAME, "Merci, developpez.net"); 
    } 
  
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
      System.out.println("BINGO ! "); 
    } 
  }
Pour l'utiliser sur plusieurs boutons :

Code java : S�lectionner tout
1
2
3
4
5
QuelleBelleAction belle = new QuelleBelleAction(); 
JButton but1 = new JButton(belle); 
JButton but2 = new JButton(belle); 
paneau.add(but1); 
panneau.add(but2);
... les deux boutons r�agiront de la m�me mani�re, et auront tous les deux le m�me label. Et si l'on fait :

Code java : S�lectionner tout
belle.setEnabled(false);
... les deux boutons seront rendus indisponibles simultan�ment.

On peut de la m�me fa�on mettre plusieurs JTable (ou JTree, ou...) apparemment identiques, parce qu'ils ont le m�me mod�le, et non parce que le composant graphique est le m�me.

Mis � jour le 6 juin 2009 gifffftane

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 suivant
 

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