我正在编写必须绘制平滑连接线的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();
当我画得有点慢时它很好,但是当我这样做的时候会显示更快的单椭圆形,是否有任何方法可以让这些椭圆形渐晕?
答案 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>
paintComponent(Graphics g)
方法中(如果这是一个Swing GUI),遍历每个点之间的List绘制线。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中进行自定义绘画的人都应该知道它是如何工作的
答案 2 :(得分:0)
您需要记住之前的鼠标位置,然后在新旧位置之间的每个点绘制椭圆....
...或者看看绘制线功能是否可以满足您的需要并在那里做同样的事情。
答案 3 :(得分:0)
您的鼠标不会逐个像素地移动。为了更快,它将跳过一些。如果你想在中间绘制椭圆,那么我建议你使用“线条绘制”方法在空白区域绘制椭圆。
你不能真正得到任何平滑的像素被跳过。这样做的算法相当复杂。
你能做的最好的事情就是在两者之间绘制一条椭圆形线,记住最后一点使用“mousegrab”。