2016-03-25 4 views
3

Ce code est pour dessiner sur un JPanel. Dans le paintComponent(Graphics) j'essaie de dessiner des courbes par répétées Graphics2D#fillOval(x, y, with, height).Comment dessiner une courbe continue d'ovales répétés sur le déplacement rapide du curseur de la souris?

L'application fonctionne correctement, et lorsque je fais glisser le curseur de la souris lentement; il dessine une courbe continue comme j'ai besoin. Mais quand j'accélère le déplacement du curseur de la souris, le résultat est des points séparés et non une courbe continue.

Alors, comment faire pour dessiner une courbe continue même si j'accélère le glissement?

import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 
import javax.swing.*; 

public class Painter extends JPanel { 

    int x, y; 
    ArrayList<Point> points; 

    public Painter() { 

     setBackground(Color.white); 
     points = new ArrayList<>(); 

     MouseHandler listener = new MouseHandler(); 
     this.addMouseMotionListener(listener); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(600, 600); 
    } 

    private class MouseHandler extends MouseAdapter implements MouseMotionListener { 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      Point point = new Point(e.getX(), e.getY()); 
      points.add(point); 
      repaint(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 
     for (Point point : points) { 
      g2d.fillOval(point.x, point.y, 15, 15); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.setContentPane(new Painter()); 
       f.pack(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+2

Dessiner un ovale du point dans une ligne au point suivant – MadProgrammer

+0

S'il vous plaît voir modifier pour répondre. –

Répondre

3

Comme mentionné dans le commentaire à votre précédente question similaire:

  • Ne pas dessiner des ovales discrets dans votre méthode de paintComponent.
  • Connectez plutôt les points de la liste dans PaintComponent en dessinant des lignes entre des points adjacents.
  • Si vous souhaitez épaissir la ligne, modifiez la propriété Contour de l'objet Graphics2D en utilisant une épaisseur plus large.
  • Soyez prudent avec Strokes, car souvent vous ne voulez pas que la modification de la propriété se propage dans la chaîne de peinture. Cela signifie que parfois vous voudrez copier l'objet Graphics et définir le Stroke sur le nouvel objet Graphics et peindre avec cela, puis en disposer.
  • La méthode la plus simple pour créer un contour consiste à utiliser la classe BasicStroke; par exemple, new BasicStroke(6f) vous obtiendra une belle courbe épaisse.

Par exemple:

import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 

import javax.swing.*; 

public class Painter2 extends JPanel { 

    private static final float STROKE_WIDTH = 15f; 
    private static final Stroke STROKE = new BasicStroke(STROKE_WIDTH, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); 
    int x, y; 
    ArrayList<Point> points; 

    public Painter2() { 

     setBackground(Color.white); 
     points = new ArrayList<>(); 

     MouseHandler listener = new MouseHandler(); 
     this.addMouseMotionListener(listener); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(600, 600); 
    } 

    private class MouseHandler extends MouseAdapter implements MouseMotionListener { 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      Point point = new Point(e.getX(), e.getY()); 
      points.add(point); 
      repaint(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 
     g2d.setStroke(STROKE); 
     for (int i = 1; i < points.size(); i++) { 
      int x1 = points.get(i - 1).x; 
      int y1 = points.get(i - 1).y; 
      int x2 = points.get(i).x; 
      int y2 = points.get(i).y; 
      g2d.drawLine(x1, y1, x2, y2); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.setContentPane(new Painter2()); 
       f.pack(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

Ou mieux encore:

import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class Painter2 extends JPanel { 

    private static final float STROKE_WIDTH = 15f; 
    private static final Stroke STROKE = new BasicStroke(STROKE_WIDTH, BasicStroke.CAP_ROUND, 
      BasicStroke.JOIN_ROUND); 
    private static final Color CURVES_COLOR = Color.BLUE; 
    private static final Color TEMP_CURVE_COLOR = Color.PINK; 
    private List<List<Point>> curvesList = new ArrayList<>(); 
    private List<Point> tempCurve = null; 

    public Painter2() { 
     setBackground(Color.white); 
     MouseHandler listener = new MouseHandler(); 
     addMouseListener(listener); 
     addMouseMotionListener(listener); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(600, 600); 
    } 

    private class MouseHandler extends MouseAdapter implements MouseMotionListener { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      tempCurve = new ArrayList<>(); 
      tempCurve.add(e.getPoint()); 
      repaint(); 
     } 

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

     @Override 
     public void mouseReleased(MouseEvent e) { 
      tempCurve.add(e.getPoint()); 
      curvesList.add(tempCurve); 
      tempCurve = null; 
      repaint(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setStroke(STROKE); 
     g2.setColor(CURVES_COLOR); 
     for (List<Point> curve : curvesList) { 
      drawCurve(g2, curve); 
     } 

     if (tempCurve != null) { 
      g2.setColor(TEMP_CURVE_COLOR); 
      drawCurve(g2, tempCurve); 
     } 

     g2.dispose(); 
    } 

    private void drawCurve(Graphics2D g2, List<Point> ptList) { 
     for (int i = 1; i < ptList.size(); i++) { 
      int x1 = ptList.get(i - 1).x; 
      int y1 = ptList.get(i - 1).y; 
      int x2 = ptList.get(i).x; 
      int y2 = ptList.get(i).y; 
      g2.drawLine(x1, y1, x2, y2); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.setContentPane(new Painter2()); 
       f.pack(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setVisible(true); 
      } 
     }); 
    } 
}