快速移动鼠标时防止出现虚线

Preventing Dotted Lines When Mouse is Moved Fast

有谁知道鼠标快速移动时如何画实线? 当我缓慢移动鼠标时,线条绘制为实线,但当鼠标快速移动时,线条绘制为虚线,如下所示。

绘制线条的代码目前是这样的:

private final class MouseL extends MouseAdapter implements MouseMotionListener
{
    @Override
    public void mouseClicked(MouseEvent e)
    {
        Point p = e.getPoint();
        int half = brushDiameter / 1200;
        Graphics2D g = getImage().createGraphics();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setPaint(getColor());
        g.fillOval(p.x - half, p.y - half, brushDiameter, brushDiameter);
        g.dispose();
        repaint(p.x - half, p.y - half, brushDiameter, brushDiameter);
    }

    @Override
    public void mouseDragged(MouseEvent e)
    {
        mouseClicked(e);
    }

但我想更改它,使线条看起来很稳固。非常感谢任何有助于实现这一目标的帮助。

简单:如果要绘制曲线,请不要绘制单个点或椭圆。而是使用 g.drawLine(...) 将相邻点连接成一条线。如果您想要更粗的曲线,请更改 Graphics2D 的描边宽度。

例如:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Stroke;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

@SuppressWarnings("serial")
public class DrawCurve extends JPanel {    
    private static final int PREF_W = 600;
    private static final int PREF_H = PREF_W;
    private static final Color CURRENT_PTS_COLOR = Color.BLUE.brighter().brighter();
    public static final Color IMG_COLOR = Color.RED;
    public static final Stroke IMG_STROKE = new BasicStroke(4f);
    private static final Color FILL_COLOR = Color.WHITE;
    private BufferedImage img = null;
    private List<Point> currentPts = new ArrayList<>();

    public DrawCurve() {
        img = new BufferedImage(PREF_W, PREF_H, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics();
        g2.setBackground(FILL_COLOR);
        g2.clearRect(0, 0, PREF_W, PREF_H);
        g2.dispose();
        MyMouse myMouse = new MyMouse();
        addMouseListener(myMouse);
        addMouseMotionListener(myMouse);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (img != null) {
            g.drawImage(img, 0, 0, null);
        }
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(CURRENT_PTS_COLOR);
        for (int i = 1; i < currentPts.size(); i++) {
            int x1 = currentPts.get(i - 1).x;
            int y1 = currentPts.get(i - 1).y;
            int x2 = currentPts.get(i).x;
            int y2 = currentPts.get(i).y;
            g2.drawLine(x1, y1, x2, y2);
        }
    }

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

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

        @Override
        public void mouseReleased(MouseEvent e) {
            currentPts.add(e.getPoint());
            Graphics2D g2 = img.createGraphics();
            g2.setColor(IMG_COLOR);
            g2.setStroke(IMG_STROKE);
            for (int i = 1; i < currentPts.size(); i++) {
                int x1 = currentPts.get(i - 1).x;
                int y1 = currentPts.get(i - 1).y;
                int x2 = currentPts.get(i).x;
                int y2 = currentPts.get(i).y;
                g2.drawLine(x1, y1, x2, y2);
            }
            g2.dispose();
            currentPts.clear();
            repaint();

        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("DrawCurve");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new DrawCurve());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}