Ecouteur et nombre indefini de Button

Résolu
cs_oceane751 Messages postés 150 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 20 décembre 2012 - 15 avril 2007 à 18:38
cs_oceane751 Messages postés 150 Date d'inscription jeudi 23 décembre 2004 Statut Membre 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!
A voir également:

12 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
17 avril 2007 à 20:38
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
3
indiana_jules Messages postés 750 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 23 décembre 2008 22
16 avril 2007 à 09:16
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
0
cs_oceane751 Messages postés 150 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 20 décembre 2012
16 avril 2007 à 14:01
comment ça?
je ne comprends pas..
0
cheplu Messages postés 16 Date d'inscription vendredi 2 février 2007 Statut Membre Dernière intervention 1 juillet 2007
16 avril 2007 à 21:31
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_oceane751 Messages postés 150 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 20 décembre 2012
17 avril 2007 à 00:33
et si je n'utilise qu'un seul bouton?
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
17 avril 2007 à 15:21
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
0
cs_oceane751 Messages postés 150 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 20 décembre 2012
17 avril 2007 à 17:38
ah aouis c'est pas mal comme code!!!
mais si je rajoute une TextField, ça va poser pb, non?
0
cs_oceane751 Messages postés 150 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 20 décembre 2012
17 avril 2007 à 17:46
'jai fait ça :
OptionPane.showMessageDialog(

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

mais ya beaucoup d'erreurs....
0
cs_oceane751 Messages postés 150 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 20 décembre 2012
17 avril 2007 à 18:04
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..
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
17 avril 2007 à 18:58
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
0
cs_oceane751 Messages postés 150 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 20 décembre 2012
17 avril 2007 à 20:19
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!
0
cs_oceane751 Messages postés 150 Date d'inscription jeudi 23 décembre 2004 Statut Membre Dernière intervention 20 décembre 2012
17 avril 2007 à 21:12
oki c'est noté!!

merci beaucoup pour m'avooir bien aidé!! suis happy !!!! ;)
0
Rejoignez-nous