我正在编写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"是在上使用的。