Dessiner un rectangle sur une image

Dessiner un rectangle sur une image - Java - Programmation

Marsh Posté le 08-06-2007 à 18:23:37    

Bonjour,
 
Voila alors j'ai une image dessinee dans un JPanel (image qui peut change suivant les actions sur une JTable) et je voudrais pouvoir dessiner sur cette image des rectangles 9ou l'on verrai que le contour. C'est en fait pour que l'utilisateur puisse selectionner certaine partie de l'image.
Le rectangle serait donc defini comme sur un logiciel comme paint, l'utilisateur clique sur le bouton gauche puis bouge la souris jusqu a ce que la taille lui convienne..et lache le bouton.
 
Mon probleme est que je n'arrive pas a effacer le rectangle dessine au fur et a mesure que l'utilisateur l'agrandi.
 
voila mon bout de code :
 

Code :
  1. panImagePage = new ChangeImageJPanel("./src/img/ImageJPG.jpg" );
  2. panImagePage.setLayout(null);
  3. panImagePage.setLocation(new Point(16, 101));
  4. panImagePage.setSize(new Dimension(353, 446));
  5. panImagePage.addMouseListener(new MouseListener()
  6.   {
  7.    public void mouseClicked(MouseEvent e)
  8.    {
  9.    }
  10.       public void mousePressed(MouseEvent e)
  11.       {
  12.        xs = e.getX();
  13.     zs = e.getY();
  14.     start=1;
  15.       }
  16.       public void mouseReleased(MouseEvent e)
  17.       {
  18.        Graphics g = getGraphics();
  19.        xf = e.getX();
  20.     zf = e.getY();
  21.     int x = (int)xs + 16 + 331 + 5;
  22.                 int y = (int)zs + 101 + 18 + 23;
  23.                 int x1 = (int)xf - (int)xs;
  24.                 int y1 = (int)zf - (int)zs;
  25.     g.drawRect(x,y,x1,y1);
  26.     start=0;
  27.     nextX = 0;
  28.     nextY = 0;
  29.       }
  30.       public void mouseEntered(MouseEvent e)
  31.       {
  32.       }
  33.       public void mouseExited(MouseEvent e)
  34.       {
  35.       }
  36.   });
  37.   panImagePage.addMouseMotionListener(new MouseMotionListener(){
  38.    public void mouseDragged(MouseEvent e) {
  39.     if (start==1){
  40.                  int x = (int)xs + 16 + 331 + 5;
  41.                  int y = (int)zs + 101 + 18 + 23;
  42.                  nextX = e.getX()-(int)xs;
  43.                  nextY = e.getY()-(int)zs;
  44.   Graphics g = getGraphics();
  45.      //g.clearRect(x, y, prevX, prevY);
  46.      g.clipRect(x,y,nextX,nextY);
  47.      g.drawRect(x,y,nextX,nextY);
  48.                  g.dispose();
  49.      }
  50.    }
  51.    public void mouseMoved(MouseEvent e) {
  52.    }
  53.   });


 
La j'utilise g.clipRect pour justement ne pas avoir ce probleme mais c'est une solution de secours.
Puis de toute facon si l'utilisateur revient en arriere ( reduit le rectangle) cela repose le probleme.
 
Desole pour les accents, je suis sur un clavier anglais.
merci beaucoup.

Reply

Marsh Posté le 08-06-2007 à 18:23:37   

Reply

Marsh Posté le 13-06-2007 à 19:37:05    

Salut,  
ton pb ,c'est que tu dois séparer la partie dessin de la partie traitement des inputs souris/claviers/etc...
 
Tu devrais pt-e aussi considérer l'utilisation d'un canvas plutot qu'un JPanle pr dessiner.
L'idée c'est que ton image se rafraichit indépendamment du reste.
P.ex. tu as un thread qui court qui rafraichit l'image tous les tant de s. Pendant ce temps, lorsque tu cliques avec ta souris, tu enregistres des infos comme quoi il y a un clic droit à tel position et le bouton n'est pas relaché. Et tu enregistres aussi les déplacements de la souris.
 
En pseudocode, ca donnerait une méthode du genre:

Code :
  1. void paint(Graphics g){
  2.     draw(image de fond);
  3.     if (click droit appuyé && click droit non relâché && souris a bougé){
  4.         drawRect(pos_init, pos_new, etc...);
  5.     }
  6. }
  7. void mousePressed(event e){
  8.     pos_init_X=e.getX();
  9.     pos_init_Y=e.getY();
  10. }
  11. void mouseDragged(event e){
  12.     pos_new_X=e.getX();
  13.     pos_new_Y=e.getY();
  14. }
  15. etc...


 
La grosse différence par rapport à ta méthode, c'est que l'image est toujours rafraichie et tu n'attends plus une action utilisateur dans MouseDragged pour redessiner.


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed