它会很长,所以提前感谢阅读和/或回答:)
编辑:这个How to draw a continuous curve of repeated ovals on speedy mouse cursor dragging?有一个答案我不是完全没问题,除了在矩形或椭圆之间绘制直线外,没有别的办法吗? (如果是矩形或椭圆形,对我来说无关紧要)。
我搜索了很多但没找到我要找的东西,所以我们走了: 我必须为大学创建一个绘图应用程序,我几乎完成了,但我的一个问题是,mouseDragged事件似乎没有足够快地识别移动(?)。这意味着,如果用户使用画笔徒手绘制并且移动鼠标太快,则程序将不会绘制“连续的矩形线”。相反,图纸中会有许多空白。这就是我的paint()覆盖和mousemotionlistener(对于currentTool 1应该等于画笔/笔)的样子:
public void paint(Graphics g){
g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 1.0f));
Iterator<Color> sc = strokeColours.iterator();
Iterator<Color> fc = fillColours.iterator();
Iterator<Boolean> fill = fillq.iterator();
for (Shape s : shapes){
g2d.setStroke(new BasicStroke(4));
g2d.setPaint(sc.next());
g2d.draw(s);
g2d.setPaint(fc.next());
if (fill.next()){
g2d.fill(s);
}
}
if (temp!=null){
g2d.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.5f));
g2d.setPaint(strokeColour);
g2d.draw(temp);
if(isfilled){
g2d.setPaint(fillColour);
g2d.fill(temp);
}
}
}
动作者:
this.addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
mx2=e.getX();
my2=e.getY();
if (currentTool==1){
Shape point= new Rectangle2D.Double(mx2-(0.5*penStroke),my2-(0.5*penStroke),0.5+penStroke,0.5+penStroke);
shapes.add(point);
addColours(strokeColour);
}
else if(...){...
}
repaint();
}
} );
}
注意:手动定义addColours(Color c)功能,将strokeColour添加到strokeColours和fillColours,并将“true”添加到fillq。 penStroke是通过使用滑块定义的,仅用于此“工具”。
答案 0 :(得分:1)
看看Shape,一些子类会做贝塞尔曲线等。对于最后检测到的鼠标点,请尝试使用CubicCurve2D.Float,QuadCurve2D.Double等。请注意,并非曲线的所有“控制”点都位于曲线本身上,但如果没有(很多)数学,则可以获得良好的结果。