绘制过快时未连接的椭圆



我正在编写Applet,它必须绘制平滑的连接线,我用这条线(用户正在输入笔的宽度)

    public void mouseDragged(MouseEvent arg0)
    {   
    g.setColor(kolor);
    int width=Integer.parseInt(szPedzel.getText());
    g.fillOval(arg0.getX(), arg0.getY(), width, width); 
    }

其中g=this.getGraphics();

当我画得有点慢的时候,这很好,但当我画的更快的时候,会显示单个椭圆,有什么方法可以连接这个椭圆吗?

img:http://i42.tinypic.com/1536x04.png

不,你不想这样画:

public void mouseDragged(MouseEvent arg0)
{   
  g.setColor(kolor);
  int width=Integer.parseInt(szPedzel.getText());
  g.fillOval(arg0.getX(), arg0.getY(), width, width); 
}

其中g = this.getGraphics();

如果在组件上使用getGraphics(),则由此获得的Graphics对象将是短暂的,并且所有生成的图像都有可能无法正确绘制。不相信我?然后最小化,然后在GUI运行时恢复它,看着你的椭圆消失。

相反,我建议:

  • 为绘图组件指定ArrayList<Point>
  • 在GUI的paintComponent(Graphics g)方法中(如果这是Swing GUI),遍历每个点之间的List绘制线
  • 在MouseMotionListener中,将Points添加到列表中,然后调用repaint()
  • 如果需要更粗的线,则将Graphics对象强制转换为Graphics2D对象,并在其上调用setStroke(Stroke s),传入厚度>1的BasicStroke对象。

  • 例如,请查看此链接。

不要使用getGraphics这不是自定义绘画的方式。

这是不可靠的,因为它可以返回null,只是上一个绘制周期中绘制内容的快照,内容将在下一个绘制循环中丢弃。

自定义绘制最好通过覆盖从JComponent 扩展的组件的paintComponent方法来实现

查看Performing Custom Painting了解更多细节,以及AWT和Swing中的绘画,因为每个想在Swing/AWT中进行自定义绘画的人都应该知道它是如何工作的

例如

您需要记住上一个鼠标位置,然后在新旧位置之间的每一点绘制椭圆。。。。

或者看看绘制线函数是否能满足您的需要,并在那里做同样的事情。

鼠标一次不会逐个像素移动。为了跑得更快,它会跳过一些。如果你想在中间画椭圆,那么我建议你使用"直线绘制"的方法在空白处画椭圆

如果跳过像素,则无法获得任何平滑度。这样做的算法相当复杂
你能做的最好的事情就是在它们之间画一条椭圆线,记住最后一点"mousegrab"是在上使用的。

相关内容

  • 没有找到相关文章

最新更新