Partage
  • Partager sur Facebook
  • Partager sur Twitter

Attendre un clic sur un bouton - IHM java

    14 avril 2012 à 15:51:42

    Bonjour / Bonsoir,

    Voilà, je suis en train de coder une application en java avec une IHM. Seulement, à un moment, je veux faire attendre que l'utilisateur clique sur un bouton et j'y arrive pas -_-'

    J'ai donc crée une fonction qui permet d'attendre avec un wait(). Et un thread qui réaffiche ma fenetre principal. Je lancele thread puis l'attente mais ensuite, je ne peux plus rien faire dans ma JFrame :colere2:

    C'est le bouton, qui quand il sera cliqué, va faire le notify() pour faire reprendre le thread principal.

    La fonction d'attente et celle avec le notify() sont en synchronized.

    J'ai lu pas mal de truc sur les thread, le wait(), le notify() etc... Mais vraiment, je trouve pas :(

    Comment je peux faire pour afficher la fenêtre et attendre le clic avec la fenêtre "active" ?

    Merci d'avance pour votre aide :)
    • Partager sur Facebook
    • Partager sur Twitter
      14 avril 2012 à 15:57:12

      Salut, pourquoi tu t'embêtes avec une boucle ? À la base tant que l'utilisateur ne clique pas sur ton bouton la méthode actionPerformed() de son ActionListener n'est pas appelée, donc il suffit d'y placer le code que tu veux exécuter quand l'utilisateur clique sur le bouton.
      Je suis même pas sur que tu aies besoin de bloquer le thread principal, d'ailleurs je pense pas que ce soit une bonne chose.
      • Partager sur Facebook
      • Partager sur Twitter
      ⚙️ Une solution simple règle le problème ; une solution compliquée en crée un nouveau.
        14 avril 2012 à 16:03:25

        Merci de te pencher sur mon cas ^^

        C'est un peu ce que j'avais fait au départ. Sauf que mon programme ne mettait pas à jour la fenêtre, donc on ne voyait pas les boutons et par conséquent on pouvait pas cliquer pour arrêter la boucle infinie qui faisait l'attente... (les instructions pour afficher la JFrame étaient bien évidement avant le lancement de la boucle ^^ )

        Dans ce cas, si je remet mon programme comme ça (sans le thread), comment faire pour que le programme affiche obligatoirement le contenu de la JFrame avant de se lancer dans la boucle infinie ?
        • Partager sur Facebook
        • Partager sur Twitter
          14 avril 2012 à 16:43:34

          Il faudrait que tu postes un bout de code qu'on puisse voir ce qui cloche et comment tu as codé le tout parce-que là il y a certaines choses que je ne comprends pas.
          Concernant le rafraîchissement de l'affichage, il faut faire

          maJFrame.validate();
          maJFrame.repaint();
          


          ou

          maJFrame.revalidate();
          


          Je suis pas sûr pour la 2ème solution, mais la première fonctionne.
          • Partager sur Facebook
          • Partager sur Twitter
          ⚙️ Une solution simple règle le problème ; une solution compliquée en crée un nouveau.
            14 avril 2012 à 17:17:31

            C'est malheureusement ce que je fais et ça ne marche pas. Ca fait comme s'il le programme sautait ces instructions :o

            J'ai repris le code sans thread.

            Voilà la fonction qui initialise la fenetre
            public void lancement(int nbJoueurs) {
            		
            	//initialisation des joueurs et ajout des boutons a la fenetre
            	try {
            			
            		//on cree les joueurs et on met la fenetre en 'mode jeu'
            		creerJoueurs(nbJoueurs);
            		fenetre.setContentPane(new PanneauJeu(this));
            		//ajout des boutonJoueurs a la fenetre
            		fenetre.getContentPane().add(boutonJoueur1);
            		fenetre.getContentPane().add(boutonJoueur2);
            
            		//ajout des boutons de la grille a la fenetre
            		for(int i=0; i<14; i++) {
            
            			fenetre.getContentPane().add(grille.getTabBouton()[i]);
            		}
            		fenetre.setVisible(true);
            		grille.afficher();
            		fenetre.validate();
            		fenetre.repaint();
            		jouer();
            	}
            	catch(IOException e1) {
            
            		erreur();
            	}
            }
            


            La fonction jouer() lance le premier joueur et fait appel à sa fonction jouer :
            public void jouer(Jeu jeu, Grille grille) {
            		
            	aJoue = false;
            	while(!aJoue) {
            	//on attend le clic sur un bouton
            	}
            }
            


            Les boutons de la grille et les boutonJoueurs ont un setAJoue(false) dans la fonction mouseClicked() et pour les boutonJoueurs c'est dans actionPerformed().

            Donc avec ce code, j'ai la fenetre de départ qui s'affiche (avec le pannel précédent) mais le panel PanneauJeu ne s'affiche pas. Donc on a pas accès aux boutons >_<

            J'ai testé toutes mes methodes à part et elles marchent toutes correctement. C'est juste quand je rajoute la ligne "jouer();" qui fait appel aux methodes "jouer" spécifiques des joueurs dans lancement que ça plante : il va direct dans la méthodes jouer() du joueur mais il repaint pas la fenêtre o_O
            • Partager sur Facebook
            • Partager sur Twitter
              15 avril 2012 à 11:03:28

              Ton code a l'air vraiment compliqué.

              fenetre.setContentPane(new PanneauJeu(this));
              fenetre.getContentPane().add(boutonJoueur1);
              fenetre.getContentPane().add(boutonJoueur2);
              


              Tu assignes un JPanel au contentPane de ta fenêtre, pourquoi tu n'ajoutes pas les boutons et la grille dans la classe PanneauJeu directement lors de sa création ?

              • Partager sur Facebook
              • Partager sur Twitter
                15 avril 2012 à 15:58:13

                Pourquoi tu dis que mon code a l'air compliqué ? :o C'est juste que c'est un code assez gros au total ^^

                Simplement parce que j'y avais pas pensé ^^ C'est dans la fonction lancement que j'ai fait tous les tests de toutes les fonctions du programme alors, j'ai pas pensé à la cleaner encore :-° Mais j'y vais de ce pas ;)
                • Partager sur Facebook
                • Partager sur Twitter

                Attendre un clic sur un bouton - IHM java

                × 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