如何在拖动鼠标时平滑地填充椭圆

时间:2019-05-10 14:29:07

标签: java swing awt paint

我正在使用MouseMotion侦听器将形状添加到HashSet,然后使用Graphics2D进行填充。但是,当我将鼠标移动得太快时,这些点将不再形成连贯的线。

我已经尝试使用Google搜索,但没有找到相关答案。

addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                //points.add(new Point(e.getX(), e.getY()));
                shapes.add(new ShapeInfo(circle, new Point(e.getX(), e.getY()), color));
                repaint();
            }
        });
for(ShapeInfo info : shapes) {
            Point location = info.point.getLocation();
            g2d.translate(location.x, location.y);
            g2d.setColor(info.color);
            g2d.fill(info.shape);
            g2d.translate(-location.x, -location.y);
        }

我希望得到一条由圆圈组成的优美而流畅的线条,但最终会出现圈定的圆圈。 https://imgur.com/a/KLOyPcn <-这是绘画时我太快地拖动鼠标会发生的情况。

2 个答案:

答案 0 :(得分:1)

您的鼠标以一定的频率工作(正常的鼠标在100Hz左右工作),因此在移动鼠标时会拾取一定数量的点。

如果您在半秒内覆盖了1000像素(这并不是很快),它将选择50个点,它们将每20像素间隔一次。

如果圆的半径小于该半径,则会看到一条虚线。

即使使用非常快的鼠标也无法使您连续显示。

如果需要,可以在点之间画一条直线而不是画一个圆,或者在最后一个圆和当前一个圆之间插入坐标,并在2个圆之间创建其他圆。

答案 1 :(得分:1)

在这里尝试这个。

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

public class FillOvals extends JPanel {
   private JFrame      frame  = new JFrame();
   private List<Point> points = new ArrayList<>();

   public static void main(String[] args) {
      SwingUtilities.invokeLater(() -> new FillOvals().start());
   }

   public FillOvals() {
      setPreferredSize(new Dimension(500, 500));
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(this);
      frame.pack();
      frame.setLocationRelativeTo(null); // center on screen
      frame.setVisible(true);
   }

   public void start() {
      MyMouseListener ml = new MyMouseListener();
      addMouseMotionListener(ml);
      addMouseListener(ml);
   }

   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (points.size() < 1) {
         return;
      }
      Graphics2D g2d = (Graphics2D) g.create();

      // keep the line smooth on the edges
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

      g2d.setColor(Color.BLUE);
      Point p = points.get(0);
      int lastx = p.x;
      int lasty = p.y;
      g2d.setStroke(new BasicStroke(10.f));
      for (int i = 1; i < points.size(); i++) {

         p = points.get(i);
         g2d.drawLine(lastx, lasty, p.x, p.y);
         lastx = p.x;
         lasty = p.y;
      }
      g2d.dispose();
   }

   private class MyMouseListener extends MouseAdapter {

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

      public void mousePressed(MouseEvent e) {
         points.add(e.getPoint());
         repaint();
      }

   }
}

JVM /鼠标无法跟上这么快的绘制圆。我提供的示例连续地在两点之间画一条线。