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

Interfaces Graphiques en Java Discussion :

addActionListener pour modifier une variable


Sujet :

Interfaces Graphiques en Java

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 7
    Points
    7
    Par défaut addActionListener pour modifier une variable
    Bonsoir tous, je débute en java et j'ai une question.

    J'ai suivi un tutoriel et j'essaye de le modifier.

    J'ai ajouté des boutons, bloqué la barre d'outils, changées les couleurs.
    Le programme lance une requête par défaut, et ce que j'aimerais c'est que lorsque j'appuie sur un des boutons que j'ai ajoutés"load2", ma requête change par une préenregistrée.
    Mais je ne sais pas comment faire
    J'ai compris que je dois utiliser un " addactionlistener", mais je ne sais pas comment modifier ma variable requête.

    Si jamais quelqu'un peut m'expliquer la démarche à suivre, ça serait gentil.

    voici le code :
    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
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    package com.sdz.connection;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    import javax.swing.JToolBar;
     
    import com.sdz.connection.SdzConnection;
     
    public class Fenetre extends JFrame {
     
     
     
      /**
      * ToolBar pour le lancement des requêtes
      */
      private JToolBar tool = new JToolBar();
     
      /**
      * Le bouton
      */
      private JButton load = new JButton("Exécution");
      private JButton load2 = new JButton("Requete 1");
      private JButton load3 = new JButton("Requete 2");
     
      /**
      * Le délimiteur
      */
      private JSplitPane split;
     
      /**
      * Le conteneur de résultat
      */
      private JPanel result = new JPanel();
     
      /**
      * Requête par défaut pour le démarrage
      */
      private String requete = "SELECT  * FROM client"; 
     
      /**
      * Le composant dans lequel taper la requête
      */
      private JTextArea text = new JTextArea(requete);
     
     
      /**
      * Constructeur
      */
      public Fenetre(){
        setSize(900, 600);
        setTitle("Léonard Christophe");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        initToolbar();
        initContent();
        initTable(requete);
     
      }
     
      /**
      * Initialise la toolbar
      */
      private void initToolbar()
      {
     
        load.setBackground(Color.LIGHT_GRAY);
        load.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
            initTable(text.getText());
          }
     
        }
        );
        load2.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
     
        /// beuu
     
          }
     
        }
        );
     
      tool.setFloatable(false);
      tool.add(load);
      tool.addSeparator();
      tool.addSeparator();
      tool.add(load2);
      tool.addSeparator();
      tool.add(load3);
        getContentPane().add(tool, BorderLayout.NORTH);
      }
     
      /**
      * Initialise le contenu de la fenêtre
      */
      public void initContent(){
        //Vous connaissez ça...
        result.setLayout(new BorderLayout());
        split = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(text), result);
        split.setDividerLocation(80);
        getContentPane().add(split, BorderLayout.CENTER);
     
     
      }
     
      /**
      * Initialise le visuel avec la requête saisie dans l'éditeur
      * @param query
      */
      public void initTable(String query){
        try {
        //On crée un statement
          long start = System.currentTimeMillis();
          Statement state = SdzConnection.getInstance().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
     
          //On exécute la requête
          ResultSet res = state.executeQuery(query);
          //Temps d'exécution
     
          //On récupère les meta afin de récupérer le nom des colonnes
          ResultSetMetaData meta = res.getMetaData();
          //On initialise un tableau d'Object pour les en-têtes du tableau
          Object[] column = new Object[meta.getColumnCount()];
     
          for(int i = 1 ; i <= meta.getColumnCount(); i++)
            column[i-1] = meta.getColumnName(i);
     
          //Petite manipulation pour obtenir le nombre de lignes
         res.last();
     
         Object[][] data = new Object[res.getRow()][meta.getColumnCount()];
     
          //On revient au départ
          res.beforeFirst();
          int j = 1;
     
          //On remplit le tableau d'Object[][]
          while(res.next()){
            for(int i = 1 ; i <= meta.getColumnCount(); i++)
              data[j-1][i-1] = res.getObject(i);
     
            j++;
          }
     
          //On ferme le tout                                     
          res.close();
          state.close();
     
     
     
          //On enlève le contenu de notre conteneur
          result.removeAll();
          //On y ajoute un JTable
          result.add(new JScrollPane(new JTable(data, column)), BorderLayout.CENTER);
         result.add(new JLabel("requête ok"), BorderLayout.SOUTH);
          //On force la mise à jour de l'affichage
         result.revalidate();
     
        } catch (SQLException e) {
          //Dans le cas d'une exception, on affiche une pop-up et on efface le contenu		
          result.removeAll();
          result.add(new JScrollPane(new JTable()), BorderLayout.CENTER);
          result.revalidate();
          JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR ! ", JOptionPane.ERROR_MESSAGE);
        }	
      }
     
      /**
      * Point de départ du programme
      * @param args
      */
      public static void main(String[] args){
        Fenetre fen = new Fenetre();
      fen.setVisible(true);
      }
    }

  2. #2
    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,

    Visiblement, le programme ne lance pas une requête par défaut, lorsqu'on clique sur le bouton load. Ce bouton lance l'exécution d'une requête qu'on tape dans un champ de saisie (text). Ce champ de saisie est initialisé avec une requête, par défaut, par ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /**
      * Requête par défaut pour le démarrage
      */
      private String requete = "SELECT  * FROM client"; 
      /**
      * Le composant dans lequel taper la requête
      */
      private JTextArea text = new JTextArea(requete);
    La requête est également exécutée à l'ouverture de la fenêtre (son premier affichage), par l'appel de initTable(requete) dans le constructeur de la fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Fenetre(){
        setSize(900, 600);
        setTitle("Léonard Christophe");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        initToolbar();
        initContent();
        initTable(requete);
      }
    On voit que l'exécution de la requête est effectuée par l'appel de initTable (nom très mal choisi) : en passant la requête en paramètre, sous forme de chaîne de caractères. Ce que fait le bouton load, c'est justement récupérer cette chaîne de caractères depuis le champ de saisi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    load.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
            initTable(text.getText()); // text.getText() récupère la valeur saisie par l'utilisateur dans le champ text
          }
     
        }
    Donc, pour exécuter une autre requête, que celle tapée dans le champ, il suffit de passer autre chose en paramètre. S'il s'agit d'une requête "préenregistrée", il faudrait déjà savoir où elle est préenregistrée. Par exemple, elle peut être directement indiquée en constante (mais on pourrait le récupérer dans un fichier, une base de données...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    load2.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
            initTable( "select * from client where ..." ); // la requête est prédéfinie (faut remplacer les ... par queque chose de syntaxiquement correct bien sûr) et c'est toujours celle-là qui sera exécutée, à chaque action sur le bouton load2
          }
     
        }
    Lorsqu'on fait ça dans un programme plus important (avec plein de classes) qu'on veut pouvoir maintenir plus facilement, on utilise des constantes. C'est un peu le but de la variable requete, sauf qu'on aurait dû en faire une constante et pas une variable (on ne la modifie jamais, autant en faire une constante).
    Donc au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /**
      * Requête par défaut pour le démarrage
      */
      private String requete = "SELECT  * FROM client";
    On aurait dû écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /**
      * Requête par défaut pour le démarrage
      */
      private static final String REQUETE = "SELECT  * FROM client";
    (évidemment, il faut remplacer requete par REQUETE dans le reste du code — il y a des conventions d'écriture en Java, et les static final sont en majuscules par convention).
    Donc, de la même façon, pour une autre requête, on peut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /**
      * Requête prédéfinie pour le bouton load2
      */
      private static final String REQUETE_1 = "SELECT  * FROM client WHERE ...";
    Et l'actionListener devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    load2.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
            initTable( REQUETE_1 ); 
          }
     
        }
    On pourrait aussi mettre le texte de la requête dans le champ, pour que l'utilisateur la voit et puisse la modifier pour la réexécuter :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    load2.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
            text.setText( REQUETE_1 );
            initTable( REQUETE_1 ); 
          }
     
        }
    Comme on veut pouvoir faire la même chose dans le bouton load3, le mieux est de faire une méthode qu'on peut appeler dans les 2 actionListeners :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void changerRequete(String requete) {
            text.setText( REQUETE_1 );
            initTable( REQUETE_1 ); 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /**
      * Requête prédéfinie pour le bouton load2
      */
      private static final String REQUETE_1 = "SELECT  * FROM client WHERE ...";
    /**
      * Requête prédéfinie pour le bouton load3
      */
      private static final String REQUETE_2 = "SELECT  * FROM client WHERE ...";
    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
    load2.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
               changerRequete(REQUETE_1);
          }
     
        }
        load3.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
               changerRequete(REQUETE_2);
          }
     
        }
    On pourrait aussi par une classe (interne à la classe Fenetre ) qui implémente ActionListener, et a un attribut requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private class RequeteActionListener implements ActionListener {
        private final String requete;
        public RequeteActionListener(String requete) {
             this.requete=requete;
        }
          public void actionPerformed(ActionEvent event)
          {
               changerRequete(requete);
          }
    }
    Dans ce cas, il ne reste plus qu'à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    load2.addActionListener(new RequeteActionListener(REQUETE_1));
    load3.addActionListener(new RequeteActionListener(REQUETE_2));
    Avec Java 8, on peut se passer de cette classe, en écrivant directement (en utilisant une expression lambda):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    load2.addActionListener(e-> changerRequete(REQUETE_1));
    load3.addActionListener(e-> changerRequete(REQUETE_2));
    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.

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Bonsoir, je n'avais pas vu votre réponse.
    J'ai résolu le souci et j'ai ajouté d'autres fonctionnalités.
    Je vais analyser votre réponse, ce qui me permettra de comprendre encore mieux.
    Merci beaucoup de votre intervention.
    Quel livre pouvez-vous me conseiller sur java?

Discussions similaires

  1. Astuce pour récupérer une variable modifiée
    Par koopajah dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 12/06/2007, 17h20
  2. Problème pour modifier une variable globale
    Par supertom dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 07/06/2007, 18h00
  3. modifier une variable dans un fichier
    Par Guismay dans le forum Langage
    Réponses: 7
    Dernier message: 11/09/2005, 19h46
  4. Comment faire pour modifier une ligne dans une DBGrid?
    Par Nico62 dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2005, 12h24
  5. Réponses: 8
    Dernier message: 23/03/2005, 19h28

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