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 :

Blocage d'une JFrame cree par un JDialog modal


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut Blocage d'une JFrame cree par un JDialog modal
    bonjour,

    j'ai un actuellement un petit probleme :

    J'ai un JDialog modal a partir duquel je cree une JFrame. Ma JFrame s'affiche sans probleme, par contre je ne peux pas interagir avec elle ( cliquer sur un bouton dans cette JFrame, ou la deplacer la fenetre, ou la reduire, etc... ) Par contre, des que je ferme le JDialog qui a cree cette JFrame, la JFrame deviens accessible.

    Je n'arrive pas a savoir a quoi c'est du et j'aimerais savoir comment faire pour que la JFrame soit accessible meme quand le JDialog est ouvert.

    merci d'avance
    mobi

  2. #2
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Salut!

    La réponse est dans la question, cela vient du fait que ta JDialog est modale.
    A mon avis, tu ne dois pas savoir ce que signifie modal, non?

    Une JDialog, lorsqu'elle est modale, bloque les autres élements graphiques tant qu'elle est ouverte, ce qui empêche l'utilisateur d'interagir avec d'autres éléments et c'est d'ailleurs tout son intérêt.

    La solution, ne rend pas ta JDialog modale en mettant "false" en tant que paramètre modale lorsque tu construit ta JDialog.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    salut!

    cree un JDialog modal bloque juste la fenetre qui l'a cree ou bloque toutes les fenetres sauf ce JDialog?

    Donc, apparament, ca bloque toutes les autres fenetres, est ce qu'il serai alors possible de bloquer seulement la fenetre qui a cree le JDialog et non pas toutes les fenetres?

    ...
    si quelqu'un a une reponse, ou une idee, je suis preneur !
    mobi

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    re!

    Bon, je n'ai pas trouver de fonctionalite bloquant seulement une fenetre.
    Pour l'instant, la solution de j'ai trouve consiste a creer un JDialog non modal, mais pour que le JDialog "bloque" la JFrame qui l'a cree, je veux redonner le focus au JDialog quand la JFrame a le focus.
    Le probleme auquel je me heurte, est que je n'arrive pas a donner le focus a une fenetre specifique, donc si quelqu'un sait comment faire, ca m'interesse!

    PS : si c'est pas clair, dite le moi...
    mobi

  5. #5
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Pour bloquer ta JFrame appelante, tu peux exploter une technique similaire à celle-ci : ftp://ftp2.developpez.tv/tv/java/sem...ava-Part18.wmv

    Chris.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    créer un JDialog modal bloque juste la fenetre qui l'a cree ou bloque toutes les fenetres sauf ce JDialog?
    La réponse est dans la Javadoc, classe Dialog :
    A dialog can be either modeless (the default) or modal. A modal dialog is one which blocks input to all other toplevel windows in the application, except for any windows created with the dialog as their owner.
    Nicolas

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Pour l'instant, la solution de j'ai trouve consiste a creer un JDialog non modal, mais pour que le JDialog "bloque" la JFrame qui l'a cree, je veux redonner le focus au JDialog quand la JFrame a le focus.
    Le probleme auquel je me heurte, est que je n'arrive pas a donner le focus a une fenetre specifique, donc si quelqu'un sait comment faire, ca m'interesse!
    requestFocus() sert à cela, non ?

    Ci-dessous un exemple, compilable et exécutable, de JDialog non modale (=> ne bloquant pas toutes les fenêtres), mais rendue artificiellement modale par rapport à une JFrame. C'est largement améliorable : l'idée était juste d'illustrer une solution.

    Nicolas

    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
    // appeler le fichier Exemple066_FrameLancantUneJDialogModaleUniquementParRapportAElle.java
     
    import java.awt.event.*;
    import javax.swing.*;
     
    // Nicolas_75, 30 août 2006
     
     
    // JFrame lançant une boîte de dialogue non modale,
    // mais lui redonnant le focus dès qu'elle le récupère
    class JFrameLauchingModalJDialog extends JFrame implements WindowFocusListener {
     
        // Jdialog associée :
        private JDialog dialog;
     
        // si la JFrame récupère le focus, elle le transmet à la JDialog :
        public void windowGainedFocus(WindowEvent e) {
            if (!(dialog==null)) dialog.requestFocus();
        }
     
        public void windowLostFocus(WindowEvent e) {}
     
        // quand la JDialog existe, la JFrame est (partiellement) stérilisée :
        // pas de redimensionnement ou de fermeture
        public void unactivate() {
            this.setResizable(false);
            this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        }
     
        // quand la JDialog est fermée, la JFrame reprend ses
        // caractéristiques normales : redimensionnable et fermable
        public void reactivate() {
            this.setResizable(true);
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
     
        // constructeur :
        public JFrameLauchingModalJDialog() {
            this.setTitle("frame2, associée à une Jdialog");
            this.setSize(300,300);
            this.setLocation(100,100);
            this.setVisible(true);
            this.addWindowFocusListener(this);
            this.unactivate();
            dialog = new LaunchedJDialog(this); //   
        }
    }
     
    // JDialog associée à la JFrame
    class LaunchedJDialog extends JDialog {
     
        // JFrame appelante :
        final private JFrameLauchingModalJDialog masterFrame;
     
        // constructeur :
        public LaunchedJDialog(JFrameLauchingModalJDialog f) {
            super(f,false); // false car non modale
            masterFrame = f;
            this.setTitle("JDialog associée à frame2");
            this.setSize(250,250);
            this.setLocation(300,300);
            // dès que cette JDialog est fermée, elle réactive la JFrame appelante :
            this.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e)  {
                    masterFrame.reactivate();
                }
            });
            this.setVisible(true);
        }
    }
     
    // "main" de démonstration :
    public class Exemple066_FrameLancantUneJDialogModaleUniquementParRapportAElle {
     
        public static void main(String[] args) {  
            JFrame frame1 = new JFrame();
            frame1.setTitle("frame seule - la fermer termine l'application");
            frame1.setSize(400,300);
            frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame1.setVisible(true);
            new JFrameLauchingModalJDialog();
        } 
    }

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Nicolas_75
    La réponse est dans la Javadoc, classe Dialog :
    A dialog can be either modeless (the default) or modal. A modal dialog is one which blocks input to all other toplevel windows in the application, except for any windows created with the dialog as their owner.
    en effet, j'avais lu la javadoc en diagonal.
    mobi

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par jproto
    Pour bloquer ta JFrame appelante, tu peux exploter une technique similaire à celle-ci : ftp://ftp2.developpez.tv/tv/java/sem...ava-Part18.wmv
    l'idee de griser la JFrame est une bonne idee, mais je prefere la solution de Nicolas_75 qui est exactement ce que je cherche et qui est plus simple a mettre en oeuvre.
    mobi

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Nicolas_75
    Ci-dessous un exemple, compilable et exécutable, de JDialog non modale (=> ne bloquant pas toutes les fenêtres), mais rendue artificiellement modale par rapport à une JFrame. C'est largement améliorable : l'idée était juste d'illustrer une solution.
    Tout d'abord, merci beaucoup, c'est tout a fait ce que je recherche
    Quand tu dis "ameliorable", c'est du point de vue genie logiciel ou performances?
    mobi

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    jproto, merci pour ce lien, très intéressant.

    mobi38, "améliorable", car ma proposition est pour l'instant du "bricolage", à affiner. Je ne le mettrais pas tel quel dans un application professionnelle. En particulier, il faut parvenir à vraiment bloquer la JFrame appelante : redimensionnement, déplacement, iconification, boutons dans la JFrame, fermeture, etc...
    Je pense que c'est possible à partir de mon embryon de code.

    Autres pistes, complémentaires ou alternatives :
    - exploiter le film proposé par jproto
    - glasspane des JFrame : http://java.sun.com/docs/books/tutor...html#glasspane
    - remplacer la JDialog par une substition du contenu de la Frame (on stocke le JPanel englobant le contenu de la JFrame, on le remplace par un autre portant le contenu de la JDialog, puis on rétablit l'écran initial)
    - (EDIT) regarder de plus près les JOptionPane. Est-ce la même "modalité" que pour les JDialog ? Documentation : "All dialogs are modal. Each showXxxDialog method blocks the current thread until the user's interaction is complete."

    Nicolas

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Pourquoi ne pas appeller une JDialog à la place d'une JFrame à partir de ta JDialog ?
    Tu met cette JDialog en non modal et tu peux ainsi passer d'une JDialog à l'autre autant que tu veux tout en bloquant ta JFrame appelante.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    salut

    en effet, ca pourrais marcher, par contre, il faut afficher le deuxieme JDialog avant le premier, sinon il ne s'affiche que lorsque je ferme le premier JDialog.
    De toute facon, je n'ai pas le choix, j'apelle une methode fournie dans un jar et c'est elle qui cree la JFrame...

    merci quand meme
    mobi

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

Discussions similaires

  1. [Débutant] affecter une matrice a une variable cree par une boucle
    Par chipo01 dans le forum MATLAB
    Réponses: 5
    Dernier message: 06/04/2013, 19h05
  2. Réponses: 13
    Dernier message: 27/07/2012, 18h38
  3. [SWING] Laisser JDialog devant une Jframe
    Par nivose110 dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 02/07/2006, 16h15
  4. [ Plugin ] Pilotage d'Eclipse par une JFrame
    Par Spiff79 dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 06/06/2006, 11h22
  5. [Image]Déplacer/enregistrer une image crée par PHP ?
    Par renaud26 dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 17/03/2006, 15h00

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