0

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

当我画得有点慢时它很好,但是当我画得更快时,单个椭圆会显示出来,有没有什么方法可以让这个椭圆形?

图片:http: //i42.tinypic.com/1536x04.png

4

4 回答 4

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>
  • 在您的 GUIpaintComponent(Graphics g)方法中(如果这是一个 Swing GUI),遍历每个点之间的 List 绘制线。
  • 在您的 MouseMotionListener 中,将 Points 添加到 List 并调用repaint().
  • 如果您想要更粗的线,则将您的 Graphics 对象转换为 Graphics2D 对象并调用setStroke(Stroke s)它,传入一个粗细大于 1 的 BasicStroke 对象。

  • 例如,请查看此链接

于 2013-12-14T22:07:53.070 回答
1

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

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

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

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

例如_

于 2013-12-14T22:07:36.820 回答
0

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

...或者看看画线功能是否可以做你需要的事情并在那里做同样的事情。

于 2013-12-14T22:02:04.143 回答
0

您的鼠标一次不会逐像素移动。为了更快,它会跳过一些。如果你想在两者之间画椭圆,那么我建议你使用“画线”的方法在空白处画椭圆。

跳过像素,您无法真正获得任何平滑度。这样做的算法将相当复杂。
你能做的最好的就是在两者之间画一条椭圆线,记住最后一点是“mousegrab”。

于 2013-12-14T22:07:43.243 回答