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

EDT/SwingWorker Java Discussion :

Attendre qu'un bouton soit cliqué pour continuer l'execution


Sujet :

EDT/SwingWorker Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Attendre qu'un bouton soit cliqué pour continuer l'execution
    Bonjour à tous,

    Bon voilà j'ai un programme qui exécuter une action en fonction des entrées de l'utilisateur. L'utilisateur utilise des JButton pour entrer les informations. Ce que je souhaite faire c'est attendre que l'utilisateur est préssé sur un bouton pour continuer l'exécution du programme.
    Pour ce projet j'essaie d'adopter le MVC pattern, et donc je ne veux pas traiter les informations à l'interieur de la methode actionPerfomed.

    En gros j'ai un méthode Main, à l'intérieur de laquelle un objet fenetreApplication est déclaré. À un certains moment la methode Main doit attendre qu'un JButton de l'objet fenetreApplication soit préssé, et une fois que c'est fait continuer l'execution du Main.

    Pour le moment j'utilise une boucle while dans la méthode Main pour attendre que le boutton soit préssé, et à l'intérieur de la méthode action performed je "set" une variable booléene a true. cette variable est utilisée comme condition d'arrêt de la boucle while dans le Main. J'utilise aussi la méthode thread.sleep() à l'interieur de la boucle while parce que je pense que ca peut empêcher le micro processeur de trop travailler a cuse de la dite boucle.

    Pour l'instant cette solution marche sans problème, mais je ne peux pas m'empêcher de penser qu'il y a une solution plus ... propre de faire ce que je veux faire, et c'est pour cette raison que je me tourne vers vous. Quelles autres possibilités s'offre à moi pour résoudre ce problème? est ce qu'elles sont meilleures que celles que j'tilise actuellement ? comment les appliquer et aussi est ce que ma solution est si mauvaise que je le pense?

    Merci d'avance pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 467
    Points : 48 756
    Points
    48 756
    Par défaut
    Citation Envoyé par mbousoli Voir le message
    Pour ce projet j'essaie d'adopter le MVC pattern, et donc je ne veux pas traiter les informations à l'interieur de la methode actionPerfomed.

    D'où tu sort cette idée? L'actionPerformed c'est bien le bon endroit pour appeler l'action à effectuer

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    12 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 373
    Points : 29 312
    Points
    29 312
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tout d'abord il existe une méthode plus propre qu'un while( !boolean ) qui attend que le boolean passe à true (qui ne consomme pas de cpu). On peut utiliser wait() et notify(). Au lieu du while, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    synchronized ( variable ) {
        variable.wait();
    }
    Et au lieu du code qui passe le boolean à true, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    synchronized( variable ) {
        variable.notify();
    }
    Mais il existe un moyen bien plus simple et adapté : utiliser un dialogue modal (voir classe JDialog, ou JOptionPane). Un dialogue modale bloque le thread appelant et attend qu'on le ferme pour continuer.
    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.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Déjà merci à tous les deux pour vos réponses aussi rapides

    1) Joel.drigo je vais essayer d'appliquer tes conseils . Et je pense que je vais plus regarder du côté de la première posibilité à savoir wait et notify() que je n'ai jamais utilisé d'ailleurs :rool:

    2)tchize_ peut être me suis-je mal exprimé, actionPerformed permet bel et bien de recupérer les informations entrées par l'utilisateur, de vérifier si elle respectent une certaine syntaxe, si elle sont correctes etc...
    Mais pour le traitement que j'ai besoin d'effectuer avec ces informations, je ne pense pas (corrige-moi si je me trompe) que je devrais le faire dans la méthode actionPerformed

    Par exemple en fonction des entrées de lutilisateur la méthode Main doit envoyer des données à d'autres utilisateurs, effectuer des caluls/recherches/comparaisons etc... avec ces informations, et donc je préférerais eviter de faire tout cela à l'intérieur de la méthode actionPerformed, j'espère que tu vois ce que je veux dire
    Encore une fois, corrige moi si je me trompe

    Merci

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 467
    Points : 48 756
    Points
    48 756
    Par défaut
    Citation Envoyé par mbousoli Voir le message
    Mais pour le traitement que j'ai besoin d'effectuer avec ses informations je ne pense pas (stp corrige moi si je me trompe) que je devrais le faire dans la méthode actionPerformed
    Je n'ai pas dit que c'est dans cette méthode que tu fais le traitement, j'ai dit que c'est bon endroit pour appeler l'action à effectuer. Un truc dans le style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void actionPerformed(ActionEvent e) { 
        String search= searchField.getText();
        tonControlleur.search(search);
    }

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    12 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 373
    Points : 29 312
    Points
    29 312
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mbousoli Voir le message
    1) Joel.drigo je vais essayer d'appliquer tes conseils . Et je pense que je vais plus regarder du côté de la première posibilité à savoir wait et notify() que je n'ai jamais utilisé d'ailleurs :rool:
    Quand j'ai dit qu'il y avait une "un moyen bien plus simple et adapté", c'est bien parce que c'était celui-là qu'il fallait privilégier dans ton cas. Il y a une autre option lorsque l'interface reste visible (le main ne fait que créer l'interface puis l'affiche), et qu'on a besoin de faire une action qui prend beaucoup de temps, qui va donc bloquer l'interface pendant longtemps, c'est d'utiliser un SwingWorker.
    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.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2013
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Encore une fois merci à tous les deux
    1) Tchize_ en effet tu as raison c'est tout à fait possible

    2)joel.drigo d'accord je vais donc me pencher sur la deuxième solution

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/01/2011, 17h45
  2. Tkinter: attendre qu'un bouton soit pressé
    Par Napech dans le forum Tkinter
    Réponses: 2
    Dernier message: 09/01/2011, 16h22
  3. [AC-2007] Attendre la fermeture d'un formulaire pour continuer le code
    Par dvnodens dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/06/2009, 23h09
  4. Attendre l'appui d'une touche pour continuer le programma
    Par Kcyril dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 05/04/2007, 16h11
  5. [VB6] attendre un événement pour continuer l'exécution
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 12/11/2002, 14h08

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