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.
- Quelles sont les diff�rences entre Awt et Swing ?
- Peut-on m�langer Awt et Swing ?
- Comment faire un minuteur (timer) facilement ?
- Mon menu contextuel s'affiche hors de l'�cran, que faire ?
- Comment mettre une image dans un bouton (AWT) ?
- Comment mettre une image dans un bouton (Swing) ?
- Comment rendre un JButton transparent ?
- Comment imprimer l'ensemble d'un Container (JDK 1.1.x) ?
- Comment enregistrer un Component en tant qu'image ?
- Lors d'un traitement long, l'affichage se fige, que faire ?
- Qu'est ce que l'Event Dispatch Thread (EDT) ?
- Comment v�rifier que l'on est bien dans l'EDT ?
- Comment ex�cuter un traitement plus tard dans l'EDT ?
- Comment lancer un traitement long ?
- Comment lancer un traitement dans l'EDT depuis un autre Thread ?
- Pourquoi ma barre de progression se remplit d'un coup ?
- Comment changer le Look & Feel de mon application ?
- Comment lister les Look & Feel disponibles ?
- Comment modifier un �l�ment du Look and Feel ?
- Comment enlever le style gras du Look and Feel par d�faut ?
- Comment d�finir les touches par d�faut ENTER et ESCAPE ?
- Comment ajouter un KeyListener � un objet JComboBox �ditable ?
- Comment changer la langue d'un JComponent sans changer la langue de tout le programme ?
- Comment changer l'arri�re-plan de certaines lignes d'une JList ?
- Comment changer la langue de mon application et toutes les conversions qui vont avec ?
- Comment disposer les composants en couches ou en niveaux ?
- Comment placer le m�me composant en plusieurs endroits simultan�ment ?
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);
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 (); } } |
- 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 !
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. */ |
| Code java : | S�lectionner tout |
public void start();
| Code java : | S�lectionner tout |
public void stop();
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); } } |
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.
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"));
| Code sql : | S�lectionner tout |
bouton.setIcon(new ImageIcon("images/bouton.gif"));
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); |
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(); } |
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(); } } |
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.
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.
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.
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 �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.
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 !") ; } }); |
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
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) {} |
| 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) {} |
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; } |
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));
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)
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) |
| 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()); |
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() ) ; |
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) |
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�.
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)
| 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)
| Code : | S�lectionner tout |
Locale loc = new Locale(String langue, String pays)
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); } }); } } |
| 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); } }); } } |
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 ! "); } } |
| 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); |
| Code java : | S�lectionner tout |
belle.setEnabled(false);
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.
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 �aLes 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.



