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
    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
    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
    David Delbecq Java developer chez HMS Industrial Networks AB.    LinkedIn | Google+

  3. #3
    Modérateur

    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
    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
    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);
    }
    David Delbecq Java developer chez HMS Industrial Networks AB.    LinkedIn | Google+

  6. #6
    Modérateur

    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
    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

###raw>template_hook.ano_emploi###