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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Probleme avec .setContentPane()


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Probleme avec .setContentPane()
    Bonjour à tous,
    Je vous soumet un problème très bizarre et que je n'arrive pas à m'expliquer.

    J'ai une interface graphique avec une liste déroulante.
    Lorsque l'on choisit un élément dans cette liste l'affichage de la page est modifié :

    voici l'action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    addActionListener(new ActionListener()
    		{
     
    			public void actionPerformed(ActionEvent e)
    			{
    				String typeTempsPartiel=types.getSelectedItem().toString();
    				String quotiteTempsPartiel=quotites.getSelectedItem().toString();
    				String nbmoistp=mois.getText();
    				Pattern mapattern=Pattern.compile("[0-9]{1,2}");
    				if (!( mapattern.matcher(nbmoistp).matches()))
    				{
    					nbmoistp="0";
    				}
    				int nbMoisTempsPartiel=Integer.parseInt(nbmoistp);
    				monCourant.afficheTP(fenetre,typeTempsPartiel,quotiteTempsPartiel,nbMoisTempsPartiel,"");
    			}
    		});
    Si j'applique cette actionPerformed à un bouton, celà fonctionne très bien.
    Par contre si je l'affecte à ma liste déroulante de manière à ce que le changement d'affichage se fasse dès la sélection je me retrouve avec un message d'erreur :
    "Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2"

    Le bout de code qui coince est celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JPanel reset=new JPanel();
    fenetre.setContentPane(reset);
    Est-ce que quelqu'un aurait une idée du pourquoi cette ligne de code passe au premier affichage, passe si on l'utilise via un bouton, mais pas si on l'intègre à la liste déroulante.
    Merci d'avance.
    Louve.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Donne le bout de code que tu as associé à ta combo et qui pose problème pas celui qui marche avec le bouton. Donne aussi la stacktrace complète.

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Salut.
    C'est le même bout de code que j'ai associé à ma combo et à mon bouton, juste que dans un cas il marche et pas dans l'autre.


    voici la stacktrace complète :
    sachant que la ligne 1739 est : fenetre.setContentPane(reset);
    et le 1722 : monCourant.afficheTP(fenetre,typeTempsPartiel,quotiteTempsPartiel,nbMoisTempsPartiel,"");


    Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.remove(ArrayList.java:492)
    at java.awt.Container.remove(Container.java:1219)
    at javax.swing.JLayeredPane.remove(JLayeredPane.java:246)
    at java.awt.Container.remove(Container.java:1264)
    at javax.swing.JRootPane.setContentPane(JRootPane.java:623)
    at javax.swing.JFrame.setContentPane(JFrame.java:698)
    at temps.affichage.afficheTP(affichage.java:1739)
    at temps.affichage$7.actionPerformed(affichage.java:1722)
    at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1258)
    at javax.swing.JComboBox.setSelectedItem(JComboBox.java:586)
    at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:622)
    at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:852)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290)
    at java.awt.Component.processMouseEvent(Component.java:6535)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:501)
    at java.awt.Component.processEvent(Component.java:6300)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4891)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    d'accord, il va falloir des détails sur comment a été construit le panel que tu retire (celui qui était le contentPane précédent) et comment a été construit le nouveau panel que tu ajoute. Dis moi, la combobox dont l'action se déclenche, elle ne ferait pas partie des éléments que tu retire puis que tu ajoute par hasard? Si c'est le cas, envisage plutôt alors ce code:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SwingUtilities.invokeLater(()-> {monCourant.afficheTP(fenetre,typeTempsPartiel,quotiteTempsPartiel,nbMoisTempsPartiel,"");});

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je pense qu'il y a un conflit à cause de la popup lightweight de la combo (qui est aussi dans le LayeredPane).

    Ce code test plante de la même façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class Test {
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel();
    		JComboBox<String> combo = new JComboBox<>(new String[]{"Choix1","Choix2"});
    		combo.addActionListener(e->changePanel(frame, panel));
    		panel.add(combo);
     
    		changePanel(frame,panel);
     
    		frame.setSize(400,400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    	private static void changePanel(JFrame frame, JPanel panel) {
    		frame.setContentPane(panel);
    	}
     
    }
    Alors que celui-ci, non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class Test {
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel();
    		JComboBox<String> combo = new JComboBox<>(new String[]{"Choix1","Choix2"});
    		combo.addActionListener(e->changePanel(frame, panel));
    		panel.add(combo);
     
    		changePanel(frame,panel);
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    	private static void changePanel(JFrame frame, JPanel panel) {
    		frame.setContentPane(panel);
    	}
     
    }
    Une solution est d'inclure le panel dans le contentPane, au lieu de remplacer le contentPane :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    frame.getContentPane().removeAll();
    frame.getContentPane().add(panel);
    Enfin, normalement, la combo ne devrait pas changer l'arborescence de composants qui la contient.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ou faire une invokeLater qui aura lieu après le retrait de la popup du coup

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    @tchize_ >> oui la Jcombobox fait partie de ce que je remplace, mais le JButton aussi (qui marche)
    @joel >> j'avais essayé le removeall pour vider le contenu de ma fenêtre, mais ça ne marchait pas (l'ancien affichage était toujours visible sous le nouveau) c'est pour ça que j'avais remplacé le code par un set d'un panel vide à la place d'un removd+ add.
    par ailleurs à la fin de ma méthode j'ai ceci pour la visibilité de ma fenetre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		fenetre.pack();
    		fenetre.setExtendedState(JFrame.MAXIMIZED_BOTH);
    		fenetre.setVisible(true);

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Louve-69 Voir le message
    @tchize_ >> oui la Jcombobox fait partie de ce que je remplace, mais le JButton aussi (qui marche)
    La combo utilise un composant pour afficher la liste, qui est mis dans le layeredpane comme le contentpane.

    Citation Envoyé par Louve-69 Voir le message
    @joel >> j'avais essayé le removeall pour vider le contenu de ma fenêtre, mais ça ne marchait pas (l'ancien affichage était toujours visible sous le nouveau)
    Le removeAll() agit sur le contenu du contentPane, pas sur son parent (il ne supprime pas le contentPane).

    Citation Envoyé par Louve-69 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		fenetre.pack();
    		fenetre.setExtendedState(JFrame.MAXIMIZED_BOTH);
    		fenetre.setVisible(true);
    Ce n'est pas l'utilisation du pack() qui change quelque chose, mais le fait que la fenêtre soit suffisamment grande pour inclure la popup de la combo ou pas.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Super ! merci. je n'avais pas bien utilisé mon removeall. j'ai donc remplacé mon set(reset) par un getcontentpane.removeall() et là ça marche !!
    merci.
    Je passe le topic en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo