绘图过快时未连接的椭圆形

时间:2013-12-14 22:00:54

标签: java drawing awt java-2d custom-painting

我正在编写必须绘制平滑连接线的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

4 个答案:

答案 0 :(得分:2)

不,你不想这样画:

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),传入一个厚度为&gt;的BasicStroke对象。 1。

  • 例如,请查看this link

答案 1 :(得分:1)

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

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

最好通过覆盖从paintComponent

延伸的组件的JComponent方法来实现自定义绘制

请查看Performing Custom Painting以获取更多详情和Painting in AWT and Swing,因为每个想要在Swing / AWT中进行自定义绘画的人都应该知道它是如何工作的

example

答案 2 :(得分:0)

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

...或者看看绘制线功能是否可以满足您的需要并在那里做同样的事情。

答案 3 :(得分:0)

您的鼠标不会逐个像素地移动。为了更快,它将跳过一些。如果你想在中间绘制椭圆,那么我建议你使用“线条绘制”方法在空白区域绘制椭圆。

你不能真正得到任何平滑的像素被跳过。这样做的算法相当复杂。
你能做的最好的事情就是在两者之间绘制一条椭圆形线,记住最后一点使用“mousegrab”。