Ecouteur et nombre indefini de Button [Résolu]

Messages postés
151
Date d'inscription
jeudi 23 décembre 2004
Dernière intervention
20 décembre 2012
- - Dernière réponse : cs_oceane751
Messages postés
151
Date d'inscription
jeudi 23 décembre 2004
Dernière intervention
20 décembre 2012
- 17 avril 2007 à 21:12
bonjour à tous!!


j'ai un nombre indefini de bouton, issu d'une requete et le soucis est que l'ecouteur n'est actif que pour seulement le dernier bouton et non pas pour l'ensemble des boutons
voici mon bout de code :
......


ResultSet resultat = instruction.executeQuery("SELECT nom, prix FROM carte ORDER BY type");
      
   while(resultat.next())
   {
    
    String resul = resultat.getString("nom");
    String prix = resultat.getString("prix");
    labe = new JLabel(resul);
    text = new TextField(prix);
    bouton = new Button("modifier");
    
    
    panel.setLayout(new GridLayout(5,2));
    panel.add(labe);
    panel.add(text);
    panel.add(bouton);
    bouton.addActionListener(this);
         
   } 


public void actionPerformed(ActionEvent e) 
 {
  if ( (Button) e.getSource() == bouton ) 


  {
   int reponse = JOptionPane.showConfirmDialog(null,"Ticket", "confirmation", JOptionPane.YES_NO_OPTION);
   
   if (reponse == JOptionPane.YES_OPTION)
   {
.......



pourtant l'ecouteur est bien dans la boucle while, je ne comprends pas trop porquoi ça en marche pas...


quelqu'un peut il m'aider?


merci!
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
5309
Date d'inscription
dimanche 4 mai 2003
Dernière intervention
18 décembre 2018
3
Merci
Salut,

le Hashtable est une collection indéxé par des valeurs et non des indices comme les tableaux, vector, list etc ... ce qui permet de simplifier la vie aux developpeurs dans certains cas (voir doc hashtable)...

la classe MyData permet simplement d'associer des objets à un un bouton donné histoire de les retrouver  le plus simplement possible.

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 104 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Twinuts
Messages postés
750
Date d'inscription
mardi 9 mars 2004
Dernière intervention
23 décembre 2008
0
Merci
Salut
cela vient peut être du fait que tu utilises des variables globales. Essai plutot des variables locales à ta boucle.

Voilà

le monde a des idées : la preuve, c'est qu'il y en a de mauvaises
ne comprends pas tout, mais je parle de tout : c'est ce qui compte
Commenter la réponse de indiana_jules
Messages postés
151
Date d'inscription
jeudi 23 décembre 2004
Dernière intervention
20 décembre 2012
0
Merci
comment ça?
je ne comprends pas..
Commenter la réponse de cs_oceane751
Messages postés
16
Date d'inscription
vendredi 2 février 2007
Dernière intervention
1 juillet 2007
0
Merci
A chaque passage dans ta boucle, tu change la valeur de ta variable "bouton". Une même varaible ne peut pas avoir plusieurs valeurs! A la sortie de ta bouclen il ne reste dans "bouton" que la valeur pour le dernier passage, soit le dernier bouton.

Tu n'as gardé aucune référence sur tous les autres boutons de créés. Si tu doit avoir plusieurs boutons, tu devrait stocké chacun d'entre eux dans un tableau ou un ArrayList.
Commenter la réponse de cheplu
Messages postés
151
Date d'inscription
jeudi 23 décembre 2004
Dernière intervention
20 décembre 2012
0
Merci
et si je n'utilise qu'un seul bouton?
Commenter la réponse de cs_oceane751
Messages postés
5309
Date d'inscription
dimanche 4 mai 2003
Dernière intervention
18 décembre 2018
0
Merci
Salut,

sinon tu peux utiliser une liste de tes boutons ou encore de faire de l'introspection sur ton panel...

exemple de code pour la liste:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Test extends JFrame implements ActionListener{

    private List<JButton> buttons = new ArrayList<JButton>();
   
    public Test(){       
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(0, 1, 5, 5));
        //simule ton while
        for(int i = 1; i < 11; ++i){
            JButton bt = new JButton("Bouton " + i);
            bt.addActionListener(this);
            panel.add(bt);
            //ajoute à la liste
            buttons.add(bt);
        }
        setContentPane(panel);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
   
    public static void main(String[] args) {
        new Test().setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();
        //teste si le bouton est dans la liste
        int index = -1;
        if((index = buttons.indexOf(src)) != -1){
            JButton bt = buttons.get(index);
            JOptionPane.showMessageDialog(this, "Je suis le bouton : " + bt.getText());
        }
    }
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Commenter la réponse de Twinuts
Messages postés
151
Date d'inscription
jeudi 23 décembre 2004
Dernière intervention
20 décembre 2012
0
Merci
ah aouis c'est pas mal comme code!!!
mais si je rajoute une TextField, ça va poser pb, non?
Commenter la réponse de cs_oceane751
Messages postés
151
Date d'inscription
jeudi 23 décembre 2004
Dernière intervention
20 décembre 2012
0
Merci
'jai fait ça :
OptionPane.showMessageDialog(

null,
"Je suis le bouton : " + bt.getText()+
" " +((TextField)e.getSource()).getText());

mais ya beaucoup d'erreurs....
Commenter la réponse de cs_oceane751
Messages postés
151
Date d'inscription
jeudi 23 décembre 2004
Dernière intervention
20 décembre 2012
0
Merci
j'ai refait :

public

void actionPerformed(ActionEvent e) {

Object src = e.getSource();

//teste si le bouton est dans la liste

int index = -1;

if((index =
buttons.indexOf(src)) != -1){

JButton bt =

buttons.get(index);

if ((TextField)e.getSource() ==
text){

JOptionPane.showMessageDialog(

null,
"Je suis le bouton : " + bt.getText() +
" " +
text.getText() );}

}

}

puis les erreurs :

Exception in thread "AWT-EventQueue-0"

java.lang.ClassCastException: javax.swing.JButtonat test.actionPerformed(

test.java:56)at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)

 

qu'en penses tu?

merci..
Commenter la réponse de cs_oceane751
Messages postés
5309
Date d'inscription
dimanche 4 mai 2003
Dernière intervention
18 décembre 2018
0
Merci
Salut,

toujours le meme problème pour les textes labels, etc .... de plus tu fais

 if ((TextField)e.getSource() ==
text)

hors dans la méthode actionPerformed e.getSource ne pourra jamais etre une instance d'un champ texte.

Note : Tu utilise un JLabel, un TextField, Button et c'est crade sérieux parce que tu mélange les composants AWT et SWING ce qu'il ne faut absolument pas faire sous peine d'obtenir des effets non désirés.

voici une solution que tu pourrais adopter :

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Hashtable;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Test extends JFrame implements ActionListener{

    private Hashtable<JButton, MyData> myDatas = new Hashtable<JButton, MyData>();
  
    public Test(){      
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(0, 1, 5, 5));
        //simule ton while
        for(int i = 1; i < 11; ++i){
            MyData md = new MyData();
            md.label = new JLabel("Label " + i);
            md.text = new JTextField("Text " + i);
            JButton button = new JButton("JButton " + i);
            button.addActionListener(this);
            panel.add(button);//affiche seulement le bouton  mais tu peux afficher ce que tu veux
            //ajoute à la liste
            //note ici on place le bouton comme clé vu qu'il est
            //le seul à pouvoir déclancher la méthode actionPerformed
            myDatas.put(button, md);
        }
        setContentPane(panel);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
  
    public static void main(String[] args) {
        new Test().setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();
        //teste si le bouton est dans la liste
        if(myDatas.containsKey(src)){
            JButton bt = (JButton)src;
            MyData md = myDatas.get(src);//récupere les champs selon le bouton
            JOptionPane.showMessageDialog(this, "Je suis le bouton : " +
                    bt.getText() + ", et moi le texte : " +
                    md.text.getText() + ", et moi le label : " + md.label.getText());
        }
    }
   
    //cette classe contient :
    // JLabel
    // JTextField
    class MyData {
        public JLabel         label     = null;
        public JTextField     text     = null;
    }
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
Commenter la réponse de Twinuts
Messages postés
151
Date d'inscription
jeudi 23 décembre 2004
Dernière intervention
20 décembre 2012
0
Merci
la vache!! t'es trop fort di dc!!

je voudrais que tu m'explique quelques trucs, car j'ai aps envie de copier du code sans meme comprendre certains points

la classe Hashtable permet de stocker des elements, un peu comme un tableau ? c'est quoi la différence?
et la classe MyData(), à quoi elle sert?

si tu pouvais m'expliquer avec des mots simples se serait un grand plus!!

merci ebaucoup en tout cas de ton aide!
Commenter la réponse de cs_oceane751
Messages postés
151
Date d'inscription
jeudi 23 décembre 2004
Dernière intervention
20 décembre 2012
0
Merci
oki c'est noté!!

merci beaucoup pour m'avooir bien aidé!! suis happy !!!! ;)
Commenter la réponse de cs_oceane751

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.