Communiquer avec l'utilisateur

dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012 - 18 déc. 2010 à 06:29
 Utilisateur anonyme - 23 déc. 2010 à 11:27
Bonjour à tous,

je cherche à communiquer avec l'utilisateur pour tracer une ligne droite.
j'ai essayer ceci, mais cela ne fonctionne pas.

//Le Bouton "Ligne" :

    private void jButtonLigneActionPerformed(java.awt.event.ActionEvent evt) {                                             
 	
labelInfos.setText("Cliquer sur le Point de Depart :");
 	PointClic=true;// recherche le 1er point

//***** ce que j'aimerai faire ******************************
// boucle d'attente du 1er point (bloc le programme et ne rend pas la main pour selectionner le point ?)
    	while (!PremierPoint){System.out.println("en attente du 1er point");}// on ne fait rien si PremierPoint n'est pas a true

if (PremierPoint==true ){
       	labelInfos.setText("Cliquer sur le Point d'arrivee :"); }

PointClic=false;// fin de la recherche du 1er point
    	
PointClic=true;// recherche le 2eme point

// boucle d'attente du 2eme point (bloc le programme et ne rend pas la main pour selectionner le point ?)
     	while (!DeuxiemePoint){System.out.println("en attente du 2eme point");}// on ne fait rien si DeuxiemePoint n'est pas a true 

   	PointClic=false;// fin de la recherche du 2eme point
    
 if (PremierPoint==true && DeuxiemePoint==true ){  Ok=true;}// les 2 points sont trouves donc Tracer la ligne

    }


la position des points est trouvée avec le MouseMove
le MousseClicked sert à valider le point trouvé

//Le Canvas :

    private void canvas1MouseClicked(java.awt.event.MouseEvent evt) {                                     
       int buttonDown = evt.getButton();

    if (buttonDown == MouseEvent.BUTTON1) {// Bouton GAUCHE enfoncé
         if (jRadioSouris.isSelected()==true && PointClic==true){
            if (PremierPoint==false && DeuxiemePoint==false && TroisiemePoint==false){// tracage avec 1 point
               x1=PointX; y1=PointY; TestNumero=NumeroPLusProche;
                    PremierPoint=true; 
                 if(Ok==true){jButtonOK.doClick();}
            }
            else if (PremierPoint==true && DeuxiemePoint==false && TroisiemePoint==false){// avec 2 points
               x2=PointX; y2=PointY;
                    DeuxiemePoint=true;
                 if(Ok==true){jButtonOK.doClick();}
             }
            else if (PremierPoint==true && DeuxiemePoint==true && TroisiemePoint==false){// avec 3 points
               x3=PointX; y3=PointY;
                    TroisiemePoint=true;
                 if(Ok==true){jButtonOK.doClick();}
            }
    }

    }


si vous avez une idée de départ, merci.

Amicalement,
DMFDMF

11 réponses

Utilisateur anonyme
18 déc. 2010 à 11:24
Bonjour

Pourquoi ne pas permettre à l'utilisateur de choisir les points en cliquant directement sur le canevas? Stocke chaque point dans une instance de la classe Point(new Point(evt.getX(),evt.getY())). A chaque fois que l'utilisateur clique sur le canevas, tu passes dans canvas1MouseClicked. La première fois que tu passes dans canvas1MouseClicked, le premier point est stocké. La deuxième fois, tu fais pareil pour le deuxième point. Ensuite, soit tu décides que l'utilisateur lance le tracé en cliquant sur un bouton, soit tu lances le tracé dans canvas1MouseClicked une fois que tu as les deux points.

Sinon, tu peux saisir les coordonnées des points dans un JTextField. Ne fais pas de boucle pour attendre une saisie dans jButtonLigneActionPerformed, ce n'est vraiment pas le genre de chose à faire dans un ActionListener. A chaque appel de jButtonLigneActionPerformed, tu ranges les données dans les variables qui servent à stocker les points et tu mets à jour un JLabel ou bien tu affiches un message en console avec System.out.println(), à toi de voir.










TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
Utilisateur anonyme
18 déc. 2010 à 12:20
Salut,

Utilise tout simplement MouseAdapter et ce listener que je nomme Moustener:

// en variable de classe
private boolean point1 = false;
private boolean point2 = false;

private int xClic1 = 0;
private int yClic1 = 0;

private int xClic2 = 0;
private int yClic2 = 0;

private class Moustener extends MouseAdapter // import java.awt.event.MouseAdapter;
      {
         public static void mouseClicked(MouseEvent evt)
         {
            if(!point1)
            {
               point1 = true;
               int xClic1 = evt.getX();
               int yClic1 = evt.getY();
               System.out.println("xClic1/yClic1: "+ xClic1 + "/" + yClic1);
            }
            if(!point2)
            {
               point2 = true;
              int xClic2 = evt.getX();
               int yClic2 = evt.getY();
               System.out.println("xClic2/yClic2: "+ xClic2 + "/" + yClic2);
            }
            if( (point1) && (point2) )
               tracerLaLigne(); // méthode à créer
            point1 = false;
            point2 = false;
         }
      }

...\ Dan /...
0
Utilisateur anonyme
18 déc. 2010 à 13:17
danimo, pourquoi dis-tu "Utilise tout simplement MouseAdapter" alors que ton code est à peu de choses près l'implémentation de la première proposition que j'ai faite? Rien ne sert d'utiliser un booléen pour chaque point, autant faire comme ça :

private Point point1,point2;

private void canvas1MouseClicked(java.awt.event.MouseEvent evt) {                                     
    int buttonDown = evt.getButton();

    if (buttonDown == MouseEvent.BUTTON1) {// Bouton GAUCHE enfoncé
        if (point1==null) {
            point1 = new Point(evt.getX(),evt.getY());
        }
        else {
            if (point2==null) {
                point2 = new Point(evt.getX(),evt.getY());                             
            }
            else {
                point1 = new Point(evt.getX(),evt.getY());
                point2 = null;
            }
        }
    }
}

public void paint(Graphics g){
    super.paint(g);
    //à toi de compléter
    //...
    if( point1!=null && point2 != null) {
        g.drawLine(point1.x,point1.y,point2.x,point2.y);    
    }
}


Le code de danimo est en partie faux comme sa méthode tracerLaLigne ne sera jamais appelée car il met point1 et point2 à false à chaque appel à son MouseListener.

Evitez de faire du dessin directement dans un MouseListener, ce n'est pas fait pour ça, c'est une mauvaise pratique. Dessinez uniquement dans les méthodes paint(Graphics g), paintComponent(Graphics g) et paintBorder(Graphics g). Bon courage.


















TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
18 déc. 2010 à 18:00
Bonjour à vous deux et merci pour votre aide,

Je n'ai pas de problèmes pour récupérer les points ou lignes
et pas de problème pour le traçage sur le canvas.

Dans mon programme, j'ai plus de 60 bouton de traçage et de fonction :
tracer ligne, arc, arc3points, ellipse, intersections, etc..

j'utilise chaque "jButton******ActionPerformed" pour faire les demandes à l'utilisateur :
donner le 1er point, donner le 2eme point ou donner la première ligne, etc..
et c'est là que je bloc quand je dois demander :
donner la première ligne : classe chercheligne();
donner le premier point : classe cherche point();
donner le point d'intersection : classe chercheintersection();
etc..

est-il possible de mettre un "mouseClicked" du canvas dans mon "jButton******ActionPerformed" ?
cela simplifierai le problème.

Merci,
DMF
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
18 déc. 2010 à 18:34
Salut gouessej,

Quand j'ai décidé de poster cette petite chose, il n'y avait pas encore ta réponse, mais comme je n'ai pas envoyé la mienne immédiatement, ce n'est que lors de sa validation que je me suis rendu compte que tu avais répondu.

Quant à la remise à false des point1 et 2, je voulais tout simplement préciser en commentaire (ou en les incluant dans le test if point1 et poin2 sans oublier les {}) qu'on devait penser à le faire après le tracer de la ligne, donc avant la demande éventuelle de nouveaux points.

Et bien entendu faire le tracer en utilisant Graphics.

Cordialement,


...\ Dan /...
0
Utilisateur anonyme
18 déc. 2010 à 18:41
dmfdmf, arrête d'utiliser l'éditeur d'interface graphique de Netbeans tant que tu ne comprendras pas en détail le fonctionnement de Swing et AWT.

Qu'est-ce que ça veut dire "j'utilise chaque "jButton******ActionPerformed" pour faire les demandes à l'utilisateur"?

Si j'ai bien compris, jButtonLigneActionPerformed est appelé quand l'utilisateur appuie sur le bouton de ton interface qui sert à passer en mode "tracé de ligne". Il n'est pas possible de mettre mouseClicked dans jButton*****ActionPerformed (c'est une idée bien étrange qui montre que tu ne sembles pas avoir compris ce que ces méthodes sont). Pourquoi fais-tu if(Ok==true){jButtonOK.doClick();} alors que dans certains endroits où tu l'appelles, Ok ne peut être qu'à false? A mon avis, tu devrais mettre à jour ta JLabel une première fois dans jButton******ActionPerformed ("Cliquer sur le Point de Depart :") puis par la suite dans canvas1MouseClicked ("Cliquer sur le Point d'arrivee :"). J'ai du mal à comprendre ce que tu cherches à faire.













TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
Utilisateur anonyme
18 déc. 2010 à 18:47
Tu devrais mettre à jour la variable Ok aussi dans canvas1MouseClicked et surtout ne fais rien de bloquant dans canvas1MouseClicked et jButtonLigneActionPerformed.















TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
20 déc. 2010 à 08:53
Bonjour Gouessej,

tu devrais mettre à jour ta JLabel une première fois dans jButton******ActionPerformed ("Cliquer sur le Point de Depart :") puis par la suite dans canvas1MouseClicked ("Cliquer sur le Point d'arrivee :").


C'est exactement ce que je fais actuellement.

En faite, vu le nombre de boutons que j'ai, j'aurai souhaité alléger
le canvas1MouseClicked.

Une petite idée pour alléger ?!

DMF
0
Utilisateur anonyme
21 déc. 2010 à 15:40
Bonjour

Si tu veux alléger canvas1MouseClicked, découpe le en plusieurs méthodes privées.












TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
23 déc. 2010 à 10:00
Bonjour Gouessej,

tu as un exemple à me montrer !?

Merci,

Amicalement,
DMF
0
Utilisateur anonyme
23 déc. 2010 à 11:27
Bonjour

Tu peux faire comme ça très schématiquement:

public void trucMachin********ActionPerformed(ActionEvent ae) {
    test1(ae);
    test2(ae);
    test3(ae);
}

private void test1(ActionEvent ae) {
    if(ae.getSource()==boutonOk) {
        //fais plein de choses...
    }
}

private void test2(ActionEvent ae) {
    if(ae.getSource()==boutonAnnuler) {
        //fais plein de choses...
    }
}







TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
Rejoignez-nous