2016-03-25 17 views
3

Dieser Code dient zum Zeichnen auf JPanel. In der paintComponent(Graphics) versuche ich, Kurven über wiederholte Graphics2D#fillOval(x, y, with, height) zu zeichnen.Wie zeichnet man eine kontinuierliche Kurve von wiederholten Ovalen beim schnellen Ziehen mit dem Mauszeiger?

Die App funktioniert OK, und wenn ich den Mauszeiger langsam ziehen; es zeichnet eine kontinuierliche Kurve, wie ich es brauche. Aber wenn ich den Mauszeiger schneller ziehe, sind die Punkte getrennt und keine kontinuierliche Kurve.

Also, wie man eine kontinuierliche Kurve zeichnen, auch wenn ich das Ziehen beschleunigen?

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

Zeichnen Sie ein Oval von Punkt in einer Linie zum nächsten Punkt – MadProgrammer

+0

Bitte beachten Sie bearbeiten zu beantworten. –

Antwort

3

Wie in Kommentar zu Ihrer vorherigen ähnlichen Frage erwähnt:

  • Sie zeichnen nicht diskret Ovalen in Ihrer paintcomponent-Methode.
  • Verbinden Sie stattdessen die in der Liste enthaltenen Punkte in der paintComponent, indem Sie Linien zwischen benachbarten Punkten zeichnen.
  • Wenn Sie die Linie dicker machen müssen, ändern Sie die Stroke-Eigenschaft des Graphics2D-Objekts, indem Sie eine mit einer größeren Dicke verwenden.
  • Seien Sie vorsichtig mit Strokes, aber da Sie oft nicht wollen, dass die Eigenschaft sich in der Farbkette ausbreitet. Das bedeutet, dass Sie manchmal das Graphics-Objekt kopieren und den Stroke auf das neue Graphics-Objekt setzen und damit streichen und dann darüber verfügen.
  • Die einfachste Möglichkeit zum Erstellen eines Stroke ist die Verwendung der BasicStroke-Klasse, z. B. new BasicStroke(6f) erhalten Sie eine schöne dicke Kurve.

Zum Beispiel:

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); 
      } 
     }); 
    } 
} 

Oder noch besser:

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); 
      } 
     }); 
    } 
}