2011-10-20 4 views
0

J'ai écrit ce petit programme de peinture, mais chaque fois que je relâche la souris et que je passe à un autre point de l'écran, la ligne est dessinée là-bas. J'ai essayé d'effacer les points lorsque la souris a été relâchée, mais cela supprime tout à l'écran.Peinture à main levée en Java

import java.awt.Canvas; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.util.ArrayList; 

public class PaintingCanvas extends Canvas implements MouseMotionListener, MouseListener { 

    private ArrayList<Point> points = new ArrayList<Point>(); 

    public PaintingCanvas(int width, int height) { 
     setBounds(0, 0, width, height); 
     addMouseMotionListener(this); 
     addMouseListener(this); 
    } 

    public void paint(Graphics g) { 

     for (int i = 0; i < points.size() - 2; i++) { 
      Point p1 = points.get(i); 
      Point p2 = points.get(i + 1); 
      g.drawLine(p1.x, p1.y, p2.x, p2.y); 
     } 

    } 

    @Override 
     public void mouseDragged(MouseEvent e) { 
     points.add(e.getPoint()); 
     repaint(); 
    } 

} 
+1

1) Pourquoi coder en utilisant des composants AWT dans le millénaire? Dans Swing, vous pouvez substituer un 'JComponent' ou' JPanel' et l'ajouter à un 'JPanel' ou' JApplet 'ou' .. ''JFrame'. 2) 'setBounds (..)' Ne faites pas cela - utilisez des mises en page. 3) Pour une meilleure aide plus tôt, postez un [SSCCE] (http://sscce.org/). –

+0

'PaintingCanvas .. implémente MouseMotionListener, MouseListener' Non, ce n'est pas le cas. –

Répondre

2

Je propose:

  • Appelez la première chose que la méthode super.paint(g); dans votre méthode de peinture.
  • Lorsque la souris est libérée, peignez l'image représentée par les points ArrayList sur une image tamponnée, puis effacez les points ArrayList, puis appelez repaint().
  • Dessinez l'image tamponnée dans la méthode de peinture. avant de dessiner vos lignes (mais vérifiez que ce n'est pas nul en premier). Vous faites cela avec la méthode Graphics#drawImage(Image image, int x, int y, ...).
  • Mieux, réécrivez ceci pour travailler dans Swing en peignant dans la méthode paintComponent de JPanel.
1

Bien sûr, cela se produit - une fois que vous commencez à dessiner à nouveau, les nouveaux points sont ajoutés après les anciens. Une fois que vous peignez après cela, ils sont inclus. Vous devrez séparer les différents chemins les uns des autres.

0

Je voudrais faire une arraylist 2d où le premier tableau est des points ajoutés jusqu'à ce que vous soulevez votre doigt, puis un nouveau tableau est ajouté pour la deuxième ligne, etc ...

1

Avez-vous regardé les classes de chemin ? Si vous dessinez simplement des lignes discrètes sur un écran, la classe GeneralPath peut être une solution simple. Le tutoriel Drawing Arbitrary Shapes explique comment les utiliser.

Fondamentalement, chaque fois que l'utilisateur appuie sur la souris (sur un événement mousePressed), vous appelez la méthode moveTo(x, y) du chemin. Pour chaque segment (en remplacement de ce que vous faites actuellement dans la méthode mouseDragged()), vous appelez la méthode lineTo(x, y) du chemin. Quoiqu'il en soit, vous devez absolument gérer les événements mousePressed ou mouseReleased, ou les deux, car vous cherchez un moyen d'indiquer le début d'une nouvelle ligne/chemin, plutôt que d'utiliser l'ancien.

1
private void jPanel1MouseDragged(java.awt.event.MouseEvent evt) { 
    points.add(evt.getPoint()); 

    for (int i = 0; i < points.size() - 2; i++) 
    { 
     Point p1 = points.get(i); 
     Point p2 = points.get(i + 1); 

     jPanel1.getGraphics().drawLine(p1.x, p1.y, p2.x, p2.y); 
    } 

} 
private void jPanel1MousePressed(java.awt.event.MouseEvent evt) { 
    points.clear(); 
    points.add(evt.getPoint()); 
} 
0

Insérer un point d'ordures -1,-1 à l'intérieur pointsmouseReleased méthode et vérifier à l'intérieur paint méthode et sauter ce point. Code à jour:

@Override 
public void mouseReleased(MouseEvent e) { 

    points.add(new Point(-1, -1)); 

} 

@Override 
public void paint(Graphics g) { 

    for (int i = 0; i < points.size() - 1; i++) { 

     Point p = points.get(i+1); 

     int x2 = p.x; 
     int y2 = p.y; 

     if (x2 == -1 || y2 == -1) { 
      ++i; 
      //continue // Considered bad practice, can play havoc with your system. (source http://xkcd.com/292/). 
     } 
     else { 
      p = points.get(i); 
      int x1 = p.x; 
      int y1 = p.y; 
      g.drawLine(x1, y1, x2, y2); 
     } 
    } 
} 

OP, comment ça fait de voir cette question après 3 ans? : D

Questions connexes