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 :

JDialog non peinte


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 908
    Par défaut JDialog non peinte
    Bonjour

    Dans mon application, je veux faire des recherches via le réseau. Pour faire patienter l'utilisateur, je veux lui afficher une boite de dialogue lui indiquant quelques infos sur la recherche. Or à l'utilisation, ma fenêtre de dialogue apparaît bien, mais toute grise !
    Or si je met la JDialog en setModal(true), elle apparaît correctement mais bloque tout le processus.
    Voici mon 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
     
                WaitDialog wd = new WaitDialog();
                wd.setLocationRelativeTo(mw);
                mw.getGLJPanel().setEnabled(false);
                int cpt = 1;
                for (Protein2 p : undefLocations) {
                    wd.updateJLabel("Processing protein "+cpt+" on "+undefLocations.size());
                    AskWeb aw = new AskWeb(this.organism, this.mapLocations, p);
                    aw.start();
                    while (aw.isAlive()) {
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException ie) {
                            ie.printStackTrace(System.err);
                        }
                    }
                    cpt++;
                }
                wd.close();
                mw.getGLJPanel().setEnabled(true);
                printLocations();
    Ma boîte de dialogue étant bien entendy Wait Dialog, voici son 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
     
    public class WaitDialog extends JDialog {
     
        private final String wait = "Please, wait while app is retrieving data";
        private final int labelsLimit = 3;
        private JLabel[] labels = new JLabel[labelsLimit];
        private JPanel panel;
        private final Dimension dim = new Dimension(320, 210);
     
        public WaitDialog() {
            buildComponents();
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
     
        private void buildComponents() {
            panel = new JPanel(new BorderLayout());
            panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            this.getContentPane().add(panel);
            panel.setBackground(Color.WHITE);
            try {
                labels[0] = new JLabel(new ImageIcon(getClass().getResource("waittoplogo.jpg")), JLabel.CENTER);
                labels[1] = new JLabel(new ImageIcon(getClass().getResource("wait_a.gif")), JLabel.CENTER);
                labels[2] = new JLabel(wait, JLabel.CENTER);
                for (int i = 0; i < labelsLimit; i++) {
                    String location = "";
                    switch (i) {
                        case 0:
                            location = BorderLayout.NORTH;
                            break;
                        case 1:
                            location = BorderLayout.CENTER;
                            break;
                        case 2:
                            location = BorderLayout.SOUTH;
                            break;
                    }
                    panel.add(labels[i], location);
                }
            } catch (NullPointerException npe) {
                JOptionPane.showMessageDialog(null, "Problem with app, exiting", "Error", JOptionPane.ERROR_MESSAGE);
                System.exit(1);
            }
            this.setMinimumSize(dim);
            this.setPreferredSize(dim);
            this.setResizable(false);
            this.setUndecorated(true);
            this.setAlwaysOnTop(true);
            this.requestFocus();
            this.setVisible(true);
        }
     
        public void close() {
            this.setVisible(false);
            this.dispose();
        }
     
        public void updateJLabel(String s) {
            System.out.println(s);
            final int last = this.labelsLimit - 1;
            labels[last] = new JLabel(s);
            panel.remove(last);
            panel.add(labels[last], last);
            panel.updateUI();
        }
    }
    Merci d'avance à celui qui éclairera ma lanterne.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Euh un THread.sleep dans l'EDT, c'est normal que ton JDialog tire la gueule...

    Le parcours des protéines doit êter fait dans un thread à part qui modifie ton composant (ton JDialog) en faisant appel à SwingUtilies.invokeLater.

    cf http://gfx.developpez.com/tutoriel/j...ing-threading/

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 908
    Par défaut
    Bonjour Sinok

    Je me doutait que c'était ça.
    Ton post m'a éclairci, comme quoi, on ne lit jamais assez ce qu'écrit l'excellent Romain Guy.
    Merci encore à toi.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

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

Discussions similaires

  1. [SWING][JInternalFrame][JDialog] Jdialog non rattachée a sa JinternalFrame
    Par tchoukapi dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 16/01/2008, 14h22
  2. JDialog non bloquant
    Par hbellahc dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 21/08/2007, 20h18
  3. JDialog non modale toujours devant?
    Par ®om dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 09/06/2006, 10h03
  4. [JDialog] largeur non modifiable ?
    Par lilou77 dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 15/12/2005, 12h42
  5. [debutant] JDialog non modal
    Par andresan dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 12/05/2004, 14h40

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