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

Java 如何在拖动鼠标时平滑填充椭圆,java,swing,awt,paint,Java,Swing,Awt,Paint,我使用MouseMotion侦听器将形状添加到哈希集,然后使用Graphics2D填充它们。然而,当我移动鼠标太快时,这些点不再形成一条连贯的线 我尝试过谷歌搜索,但没有找到相关的答案 addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { //points.add(new Point(e.getX(), e.get

我使用MouseMotion侦听器将形状添加到哈希集,然后使用Graphics2D填充它们。然而,当我移动鼠标太快时,这些点不再形成一条连贯的线

我尝试过谷歌搜索,但没有找到相关的答案

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

我希望得到一条由圆圈组成的漂亮、平滑的线条,但最终会得到一个圆滑的圆圈 您的鼠标以特定频率工作(正常鼠标工作频率约为100Hz),因此在您移动鼠标时,它将拾取一定数量的点

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

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

即使使用非常快的鼠标也不能使你有一条连续的线


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

您的鼠标以特定频率工作(正常鼠标工作频率约为100Hz),因此在移动鼠标时,它将拾取一定数量的点

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

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

即使使用非常快的鼠标也不能使你有一条连续的线

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

在这里尝试一下

import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入java.util.List;
导入javax.swing.*;
公共类FillOvals扩展了JPanel{
私有JFrame=新JFrame();
私有列表点=新的ArrayList();
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(()->new FillOvals().start());
}
公共FillOvals(){
setPreferredSize(新尺寸(500500));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。添加(此);
frame.pack();
frame.setLocationRelativeTo(null);//在屏幕上居中
frame.setVisible(true);
}
公开作废开始(){
MyMouseListener ml=新的MyMouseListener();
addMouseMotionListener(ml);
addMouseListener(ml);
}
公共组件(图形g){
超级组件(g);
if(points.size()<1){
返回;
}
Graphics2D g2d=(Graphics2D)g.create();
//保持线条边缘光滑
g2d.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.BLUE);
点p=点。获取(0);
int lastx=p.x;
整容=整容;
g2d.设定行程(新基本行程(10.f));
对于(int i=1;i
JVM/鼠标无法跟上绘制圆圈的速度。我提供的示例在两个点之间连续绘制了一条线。

这里试试这个

import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入java.util.List;
导入javax.swing.*;
公共类FillOvals扩展了JPanel{
私有JFrame=新JFrame();
私有列表点=新的ArrayList();
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(()->new FillOvals().start());
}
公共FillOvals(){
setPreferredSize(新尺寸(500500));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。添加(此);
frame.pack();
frame.setLocationRelativeTo(null);//在屏幕上居中
frame.setVisible(true);
}
公开作废开始(){
MyMouseListener ml=新的MyMouseListener();
addMouseMotionListener(ml);
addMouseListener(ml);
}
公共组件(图形g){
超级组件(g);
if(points.size()<1){
返回;
}
Graphics2D g2d=(Graphics2D)g.create();
//保持线条边缘光滑
g2d.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.BLUE);
点p=点。获取(0);
int lastx=p.x;
整容=整容;
g2d.设定行程(新基本行程(10.f));
对于(int i=1;i

JVM/鼠标无法跟上绘制圆圈的速度。我提供的示例在两个点之间画了一条连续的线。

你所说的连贯线是什么意思?请提供足够的代码来说明问题。你所说的连贯线是什么意思?请提供足够的代码来说明问题。
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);
        }