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

Agents de placement/Fenêtres Java Discussion :

[JOptionPane] [JTable] la boite de Dialogue s'affiche 2 fois


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut [JOptionPane] [JTable] la boite de Dialogue s'affiche 2 fois
    Bonjour,

    Voilà j'ai un JPanel qui contient des JTable. Lorsuqe je rentre une donnée dans un JTable je fais un controle que la donnée rentrée n'existe pas déjà. Si c'est le cas j'envoie une JDialog d'erreur (je fais ça dans setValueAt de mon TableModel). Le problème c'est qu'apparemment l'ouverture de cette boite de dialogue déclenche un nouveau setValueAt et je repasse donc par le même code et ma boite de dialogue s'affiche deux fois de suite. Avec mle code ça sera sans doute plus clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void setValueAt(Object value, int row, int col) {
                System.out.println("setValueAt");
                data[row][col] = value;
                if ( col==0) {
                    boolean ok=AdaptateurP.AdaptateurGroupe.modifierGroupe_Name( (String) data[row][oidCol], (String) value);
                    if(!ok){
                        AdaptateurP.AdaptateurFenetreX.sendDialog("Nom de groupe déjà existant");
                        data[row][col] = nameDefault;
                        return;
                    }
    fireTableRowsUpdated( row, row);
                }
    Et la méthode sendDialog fais tout simplement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      public void sendDialog(String s){
            JOptionPane.showMessageDialog(this, s,"Erreur!",JOptionPane.ERROR_MESSAGE);
        }
    Voilà si je commente la ligne AdaptateurP.AdaptateurFenetreX.sendDialog("Nom de groupe déjà existant"); je ne passe bien qu'un seule fois dans ma méthode setValueAt().

    Auriez vous une idée de comment je peux m'y prendre pour éviter ce comportement?
    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut
    je viens de me rendre compte d'autre chose :
    J'ai une méthode sur ma table qui lorsque je clique sur une cellule prend le focus (avec curseur qui clignote( méthode que j'ai emprunté d'ailleurs ici sur ce forum :-) ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    table.addMouseListener(new MouseAdapter() { 
              public void mouseClicked(MouseEvent e) { 
                    Point p = e.getPoint(); 
                    int col = table.columnAtPoint(p); 
                    int row = table.rowAtPoint(p); 
                    if (table.isCellEditable(row, col)) { 
                      table.editCellAt(row, col); 
                      table.getEditorComponent().requestFocus(); //fonctionne si je commente cette ligne
                    } 
                  } 
            });
    Voilà et si je commente la ligne table.getEditorComponent().requestFocus(); et bien je n'ai plus mon problème. La BDD ne s'affiche qu'une fois...
    Est ce que ça dit quelque chose à qqn?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut
    oui en fait le requestfocus() déclenche la méthode setValueAt() puis quand je perd le focus de ma cellule une fois éditée je repasse dans le setValueAt() d'ou ma boite de dialogue qui s'affiche deux fois!!
    Bien maintenant que j'ai a peu près compris ce qu'il se passe je cherche ue solution pour éviter ça...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7
    Par défaut
    Essaie de voir si tu mets des ecouteurs d'évènement sur des objets static. Ca m'est arrivé une fois. Je m'explique:

    J'avais un bouton qui m'ouvrait une fenetre (jframe) dans laquelle j'avais des boutons déclarés static. J'avais un écouteur sur ces boutons qui ouvraient une jdialog. Quand je fermais ma fenêtre (jframe), et que je la réouvrais, et que je recliquais sur un des boutons, il fallait que je clique 2 fois pour fermer la jdialog , et ainsi de suite (3 fois,4fois...) . En fait, quand je créais ma fenêtre, ca me rajoutait un écouteur supplémentaire sur mes boutons, du fait qu'ils étaient déclarés static. Un objet static n'est instancié qu'une seule fois dans un programme. Donc quand je fermais ma fenêtre, les boutons static existaient toujours. Puis quand je la rouvrais, l'instruction bouton.addActionListener était éxécutée sur un bouton qui éxixtait déjà. Il fallait donc, lors de la fermeture de la jframe, que j'enlève l'écouteur du bouton, ou que je déclare celui-ci non static quand cela étatit possible.

    Si ça peut t'aider...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut
    non les objets abonnés à des évènements ne sont pas déclarés en static dans ma classe... Mais merci pour l'info qd même!
    La solution simple serait que j'enlève ce requestFocus() mais malheureusement j'en ai besoin pour un autre pb de mon appli...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut
    Bon j'ai trouvé une solution... Je ne sais pas si c'est la meilleure et surtout je n'ai pas franchement compris le comportement de mon programe mais comme ça marche je le mets si ça peut servir à quelqu'un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     public static void sendDialog(String s){
            JOptionPane opt= new JOptionPane(s,JOptionPane.ERROR_MESSAGE);
            JDialog dia=opt.createDialog(userPanel, "ERREUR");
            dia.setDefaultCloseOperation(dia.DO_NOTHING_ON_CLOSE);
            dia.setVisible(true);
        }

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

Discussions similaires

  1. [Boite de dialogue] n'affiche aucun texte
    Par Alexino2 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 15/12/2006, 12h35
  2. afficher dans une boite de dialogue la valeur d'une variable
    Par micknic dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/07/2005, 09h25
  3. [JOptionPane] Boite de dialogue à menu deroulant
    Par thom02 dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 08/05/2005, 10h43
  4. [JOptionPane] Largeur de la boite de dialogue
    Par Guybrush dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 15/09/2004, 18h17
  5. comment afficher une boite de dialogue simple ?
    Par Ekimasu dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 08/06/2004, 16h46

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