Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retourner une fonction après un event

Sujet résolu
    29 juillet 2015 à 16:27:42

    Bien le bonjour,

    J'aimerai savoir s'il y a moyen de mettre en pause une fonction jusqu'à un event (dans mon cas, un clique sur un bouton). Par exemple :

    public int maFonction() {
        JButton button = new JButton();
        MouseAdapter buttonAdapter = new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e) {
                //envoyer signal
            }
        };
       
        JButton.setVisible(true); //je sais que ce n'est pas une chose à faire, mais c'est pour raccourcir le code
    
        do_stuff();
        //attendre signal
        
        return 0;
    }

    J'ai cherché sur Internet, mais la seule manière que je vois est d'utiliser wait()/notify(), fonctions que je ne savais pas utiliser et qui, après recherche sur ces fonctions, ne semblent pas très adapté pour cette utilisation (en même temps, il me semble avoir très mal compris comment elle fonctionnait).

    Merci d'avance !

    -
    Edité par Gladear 29 juillet 2015 à 16:29:07

    • Partager sur Facebook
    • Partager sur Twitter
    Keep Calm and eat pancakes
      29 juillet 2015 à 17:13:40

      Bonjour.

      Je pense que tu as mal compris le fonctionnement.

      Que fait ta méthode maFonction() ? l'initialisation de l'interface graphique, l'exécution d'une action, ... ?

      Le MouseAdapter que tu instancies ici n'est pas exécuté : c'est uniquement lorsque l'utilisateur cliquera que sa méthode mouseClicked sera exécutée.
      Ici tu ne fais que dire au framework : voici ce que tu m'exécuteras lorsque le temps sera venu.
      Donc ce n'est pas ici que tu devras attendre la fin du traitement.

      (Si je ne dis pas de bêtise, car je ne suis pas très calé sur Swing)
      De plus, 1 seul événement ne sera exécuté à la fois, donc par défaut tu n'as pas besoin d'attendre la fin de l'événement pour continuer ton traitement, car l'écran sera figé durant le traitement.

      C'est pour cela qu'il est conseillé d'effectuer le traitement dans un Thread et de prévenir l'utilisateur que le traitement est en cours.
      Voici un exemple, à adapter :

      void init() {
      	MouseAdapter buttonAdapter = new MouseAdapter(){
      			@Override
      			public void mouseClicked(MouseEvent e) {
      				debutTraitement();
      			}
      		};
      }
      
      // déclanché lors du clic
      // cette méthode n'est pas bloquante
      void debutTraitement() {
      	// 1 : bloquer l'application (et afficher un bouton STOP par exemple)
      	new Thread(this::traitementParallèle).start(); // 2 : lancer dans un Thread traitementParallèle()
      	// 3 : afficher "Veuillez patienter..."
      }
      
      void traitementParallèle() {
      	// ...
      	finTraitement();
      }
      
      void finTraitement() {
      	// 1 : afficher "Traitement terminé !"
      	// 2 : débloquer l'application
      }
      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        30 juillet 2015 à 16:25:56

        Je vais essayer d'expliquer mon problème plus clairement, mais j'avoues ne pas être très doué pour ça !

        Dans ma méthode main(), j'appelle un fonction qui afficher une fenêtre avec 3 champs d'entrée (JEditText), qui demande 3 informations différentes, et un bouton pour valider les entrées. J'aimerai que l'utilisateur entre les informations puis appuie sur bouton, et que à ce moment là, la fonction retourne les valeurs de ces trois entrées (dans un tableau), pour pouvoir y avoir accès depuis main(). Du coup, il me semble difficile de faire ça en plusieurs fonctions.

        (Edit) J'ai trouvé comment faire !

        Certe, cela ne répond pas totalement au problème, mais ça marche dans mon cas : Vu que j'invoque une fenêtre, j'ai créé un WindowListener qui lance un lock.notify() (lock est un objet quelconque créé auparavant) lors de la fermeture de la fenêtre (windowClosed()), fenêtre que je ferme avec un dispose() lors d'un clique sur le bouton. Juste avant de retourner la fonction, voici la portion de code :

        synchronized(lock) {
            while (window.isVisible()) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        Au final, si je peux éviter de longues heures de recherche à quelqu'un :

        public Object maFonction() {
            JFrame window = new JFrame();
            init_window();
            Object lock = new Object();
        		
            //Creations de divers widgets
            JButton quitButton = new JButton("Quit");
        		
            agreeButton.addMouseListener(new MouseAdapter() {
                @Override
        	    public synchronized void mouseClicked(MouseEvent e) {
        	        window.dispose();
        	    }
            });
        
            window.addWindowListener(new WindowAdapter() {					
                @Override
        	public void windowClosed(WindowEvent e) {
        	    synchronized (lock) {
        	        lock.notify();
        	    }
        	}
            });
        				
            init_composants();
            window.setVisible(true);
        		
            //Wait button click
            synchronized(lock) {
                while (window.isVisible()) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
        	}
            }		
        		
            return maValeurDeRetour;
        }


        Voilà ! Merci tout de même parce que le message m'a aidé a réaliser certaines choses :)

        -
        Edité par Gladear 30 juillet 2015 à 17:08:42

        • Partager sur Facebook
        • Partager sur Twitter
        Keep Calm and eat pancakes

        Retourner une fonction après un event

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown