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 :

Refresh d'une fenêtre


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut Refresh d'une fenêtre
    Bien le bonjour,

    J'ai un problème, j'ai une fenêtre, avec deux panel. Dans mon deuxième panel, j'ai quelques jcombobox, dépendantes par hiérarchie. Exemple, si je modifie la dernière combobox, aucun incidence. Si je modifie la première, la valeur dans les suivantes change...
    Chaque combobox est remplie à partir d'une DB, donc pour remplir chaque combobox, j'ai une requete.
    J'aimerais une methode qui permet, lorsque je modifie une CBB, de rafraichir chaque autre, ou la page complètement, mais donc en exécutant les requêtes puisque les valeurs dépendent de la valeur d'un CBB précédente...
    J'spère me faire bien comprendre.
    J'ai essayé pas mal de truc, des repaint, des refresh, ... Mais rien ne va.
    Merci d'avance si vous savez m'aider.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Essaie quelque chose dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    final JComboBox parentBox = new JComboBox(); // final ou variable d'instance
    final JComboBox childBox = new JComboBox (); // final ou variable d'instance
    parentBox.addItemListener(new ItemListener() {
      public void itemStateChanged (ItemEvent e) {
        switch (e.getStateChanged()) {
        case ItemEvent.DESELECTED: // si une valeur a été désélectionnée
          childBox.setSelected(true);
          break;
        case ItemEvent.SELECTED: // si une valeur a été sélectionnée
          childBox.setSelected(false);
          break;
        }
      }
    });
    N'aie pas peur, ton écouteur sera toujours appelé deux fois (au moins) : une fois pour la désélection de l'item courant, et une autre fois pour la sélection du nouvel item.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Ca fonctionne oui, mais ca ne rafraichit pas les données dans la liste.

    Exemple : Dans mon premier combobox, j'ai le choix entre deux batiments, si le batiment 1 est sélectionné, dans le 2e JComboBox, je dois afficher le nombre d'étages dans ce batiment, si c'est l'autre batiment, ben le nombre d'étages correspondant doit être dans l'autre JComboBox, puis lorsque je choisis l'étage, les numéros de locaux de cet étage, etc... A chaque fois que je modifie un JComboBox parent, les enfants doivent se modifier en fonction du précédent.

    JCBB1 ------> JCBB2 ------> JCBB3

    Bâtiment ---> Etage ------> Local

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Bah... il suffit de remplacer le contenu des cas du switch par ce que tu souhaites !

  5. #5
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Ca je n'en doute pas, et c'est là l'intéret de ma question, comment faire? J'ai essayé des trucs, du genre repaint, refresh, mais ca ne va pas, y a pas autre chose, une methode qui recharge complètement la fenêtre?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Object[] mesNouvellesDonnees = retrouveurDeDonnees.get(parentBox.getSelectedItem()) ;
    childBox.setModel(new DefaultComboBoxModel(mesNouvellesDonnees));
    Ca me semble pas plus compliqué que cela.

  7. #7
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Je pose mon code, parce qu'à mon avis je suis un peu hors principes de JAVA.

    Je réitère ce que je cherche précisémment, une méthode qui, lorsque je modifie la 2e combobox, rafraichit la page (la recharge entièrement).

    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
    package Index;
     
    import java.awt.* ; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import javax.swing.JPanel.*; 
    import javax.swing.event.*;
    import javax.swing.Icon.*;
    import java.sql.*;
    import javax.swing.JFrame.*;
    import javax.swing.JDialog.*;
    import java.util.*;
    /**
     *
     * @author ***
     */
    public class ajoutCable extends JPanel {
        private JPanel      pan1,pan2;
        private JLabel      message, messNumCable, messLieu, messEtage;
        private JButton     boutonValLieu, boutonValEtage, boutonValLocal;
        private Fenetre     parent;
        private JComboBox   numLibre, lieu, etage;
     
        /** Creates a new instance of ajoutCable */
        public ajoutCable(Fenetre p, Connection co) {
     
            parent = p;
            //déclarations et placement des composants
            //this.setLayout (new GridLayout(2,1,0,0));
            this.setLayout (new BorderLayout(20,20));
     
            //création, remplissage et placement du panneau titre
            pan1    = new JPanel();
            pan1.setLayout(new FlowLayout());
            message= new JLabel("Insertion d'un nouveau câble VOICE");
            message.setForeground(java.awt.Color.BLUE);
            message.setFont(new Font("Arial",Font.BOLD,16));
            pan1.add(message);
            this.add("North",pan1);
     
            //création, remplissage et placement du panneau de champs
            pan2    = new JPanel();
            pan2.setLayout(new FlowLayout());
            messNumCable= new JLabel("Numéro de câble : ");
            pan2.add(messNumCable);
            Vector vect=new Vector();
            try
                {
                    ResultSet res = AccesGen.executeQuery(co, "SELECT NumCable FROM VOICE");
                    // On défini une valeur de départ :
                    int cursor = 1;
                    while (res.next()) 
                    {
                    // Pour chaque valeur présente dans la base :
                    int value = res.getInt("NumCable");
                    // Et on boucle sur toutes les valeurs entre le curseur et la valeur retournée :
                    for (int i=cursor; i<value; i++) 
                    {
                        // TODO : la valeur 'i' n'est pas présente dans la base
                        vect.add (i);
                    }
                    // On incrémente le curseur avant de passer au suivant :
                    cursor = value + 1;
                }
                vect.add (cursor);
                }
                catch(SQLException sqle)
                {
                    System.out.println("Erreur SQL : " + sqle);
                    JOptionPane.showMessageDialog(null, "Error SQL","ERROR",JOptionPane.ERROR_MESSAGE);
            }
            numLibre = new JComboBox(vect);
            pan2.add(new JScrollPane(numLibre));
     
            messLieu=new JLabel("       Lieu :");
            pan2.add(messLieu);
     
            Vector vect2=new Vector();
            try
            {
                 ResultSet res = AccesGen.executeQuery(co, "SELECT Lieu FROM LIEU");
                 String donnees2="abc";
                 while (res.next()) 
                 {
                    //Pour chaque valeur présente dans la base :
                    String donnees = res.getString("Lieu");
                    if (donnees.equals(donnees2))
                    {
                        //test
                    }
                    else
                    {
                        vect2.add(donnees);
                    }
                    donnees2 = donnees;
                 }
            }
            catch(SQLException sqle)
            {
                 System.out.println("Erreur SQL : " + sqle);
                 JOptionPane.showMessageDialog(null, "Error SQL","ERROR",JOptionPane.ERROR_MESSAGE);
            }
            lieu = new JComboBox(vect2);
            pan2.add(new JScrollPane(lieu));
            this.add("Center",pan2);
            String lieux=lieu.getSelectedItem().toString();
     
            Vector vect3=new Vector();
            try
            {
                 ResultSet res = AccesGen.executeQuery(co, "SELECT Etage FROM LIEU WHERE Lieu = '"+ lieux +"'");
                 String donnees3="abc";
                 while (res.next()) 
                 {
                    //Pour chaque valeur présente dans la base :
                    String donnees = res.getString("Etage");
                    if (donnees.equals(donnees3))
                    {
                        //test
                    }
                    else
                    {
                        vect3.add(donnees);
                    }
                    donnees3 = donnees;
                 }
            }
            catch(SQLException sqle)
            {
                 System.out.println("Erreur SQL : " + sqle);
                 JOptionPane.showMessageDialog(null, "Error SQL","ERROR",JOptionPane.ERROR_MESSAGE);
            }
            messEtage=new JLabel("       Etage :");
            pan2.add(messEtage);
            etage = new JComboBox(vect3);
            pan2.add(new JScrollPane(etage));
            this.add("Center",pan2);
            MonGestionnaireAction x=new MonGestionnaireAction();
            lieu.addItemListener(x);
            setVisible(true);
        }
        private class MonGestionnaireAction implements ItemListener {
            public void itemStateChanged(ItemEvent e)
            {
                /*if (e.getStateChange() == ItemEvent.SELECTED)
                {
                    pan1.removeAll();
                    pan1.repaint();
                    //pan1.updateUI();
                    setVisible(true);
                }*/
                switch (e.getStateChange()) {
                    case ItemEvent.DESELECTED: // si une valeur a été désélectionnée
                        etage.setVisible(false);
                        break;
                        case ItemEvent.SELECTED: // si une valeur a été sélectionnée
                        etage.setVisible(true);
                        break;
                }
            }
        }
    }

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Si j'ai bien compris ton problème, il faut sortir le code d'initialisation de tes combos de ton constructeur et le mettre dans des méthodes.
    Ensuite, en fonction de l'évenement reçu, tu appelles les méthodes de reconstruction de tes combos.

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Typiquement, c'est ce que j'ai proposé, en utilisant un ItemListener...

    sinon, il faut créer une méthode créant un nouveau JPanel du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public JPanel createMainPanel()
    et l'appeler lors du changement des données...

    Ma méthode est nettement plus propre, efficace et facile à maintenir, mais bon, si c'est ce qu'il veut...

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    @dingoth
    Je pense qu'on dit la même chose.
    Quand je parle de reconstruction de combo, je parle simplement de réinitialisation des données.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Ok.

    Je parlais de réinitialisation des modèles uniquement, je n'avais pas compris cela en lisant ton message.

  12. #12
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    AAAAAAAHHHHHHH Ok, le franc vient de tomber...

    J'ai compris le principe... Mais la mise en pratique, ca va être plus compliqué, j'ai jamais utilisé des méthodes et autres pour ce genre de choses... Quelqu'un aurait un exemple (plus concret que ce lui présenté) à me proposer? Un vrai exemple qui tourne? Merci déjà pour les réponses, et désolé pour la lenteur de mon cerveau

Discussions similaires

  1. Refresh une fenêtre
    Par cricri77200 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 30/06/2009, 13h20
  2. [meta refresh] ds une nouvelle fenêtre
    Par sirjenny dans le forum Balisage (X)HTML et validation W3C
    Réponses: 13
    Dernier message: 16/08/2007, 16h58
  3. Rendre le curseur invisible sur une fenêtre donnée
    Par Meuhmeuh dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/11/2002, 13h25
  4. Créer une fenêtre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 11h46
  5. icône d'une fenêtre fille
    Par bastien dans le forum C++Builder
    Réponses: 6
    Dernier message: 27/05/2002, 14h46

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