Java:Graphics 2d,绘制速度不够快

Java:Graphics 2d,绘制速度不够快,java,awt,graphics2d,Java,Awt,Graphics2d,对于以下问题,我正在寻找一个相当简单的解决方案(简单是指不需要太多行代码): 我有一个绘画应用程序。应用程序的代码如下所示: 我的问题是: 如何使正方形线条像铅笔一样平滑?这与Java2D绘制速度不够快无关,尽管与渲染库应有的速度相比,Java2D是一个速度较慢的库 无论如何,在程序中声明一个Path2D.Double或Path2D.Float,并在mouseDrag上,将mouseEvent的坐标添加到此Path2D对象。 如果这是您要添加的第一个坐标,请使用moveTo()方法,或者lin

对于以下问题,我正在寻找一个相当简单的解决方案(简单是指不需要太多行代码):

我有一个绘画应用程序。应用程序的代码如下所示:

我的问题是:


如何使正方形线条像铅笔一样平滑?

这与Java2D绘制速度不够快无关,尽管与渲染库应有的速度相比,Java2D是一个速度较慢的库

无论如何,在程序中声明一个
Path2D.Double
Path2D.Float
,并在
mouseDrag
上,将
mouseEvent
的坐标添加到此
Path2D
对象。
如果这是您要添加的第一个坐标,请使用
moveTo()
方法,或者
lineTo()
方法。
完成后,调用
repaint()

在“重新绘制”中,绘制路径2D,如下所示:

public void paintComponent(Graphics graphics)
{
  Graphics2D g = (Graphics2D) graphics;
  // set appropriate color and line thickness here.
  g.draw(path);
  // draw other stuff.
  g.dispose();
}

虽然与渲染库应有的速度相比,Java2D是一个速度较慢的库,但这与Java2D绘制速度不够快无关

无论如何,在程序中声明一个
Path2D.Double
Path2D.Float
,并在
mouseDrag
上,将
mouseEvent
的坐标添加到此
Path2D
对象。
如果这是您要添加的第一个坐标,请使用
moveTo()
方法,或者
lineTo()
方法。
完成后,调用
repaint()

在“重新绘制”中,绘制路径2D,如下所示:

public void paintComponent(Graphics graphics)
{
  Graphics2D g = (Graphics2D) graphics;
  // set appropriate color and line thickness here.
  g.draw(path);
  // draw other stuff.
  g.dispose();
}

对于细线,您当前正在呼叫

g2D.drawLine(oldX, oldY, currentX, currentY);
g2D.fillRect(currentX, currentY, getXSize(), getYSize());
而对于粗线,你只是在打电话

g2D.drawLine(oldX, oldY, currentX, currentY);
g2D.fillRect(currentX, currentY, getXSize(), getYSize());
这意味着当您快速移动鼠标时,上一个鼠标位置和新鼠标位置之间将没有连接

一个简单的解决方案是将第二个调用改为

g2D.setStroke(new BasicStroke(getXSize()));
g2D.drawLine(oldX, oldY, currentX, currentY);
但是,对于当前的绘制代码,有几个可能的改进。您应该考虑不要基于一组布尔标志来决定如何绘制。相反,您可以考虑一些类似于PoN/COD>接口的接口,通过使用不同的接口实现,可以在不同的笔之间切换。 前面已经提到,您可以将这些点组合成一个
路径2D
,然后绘制该路径。这是一个很好的建议,你也应该明确考虑:它提供了一些不错的可能性。例如,您可以定义一个
笔划
,并使用任意笔形状创建一个“笔划形状”

然而,所有这些更改都可能需要相当大的重构,因此,到目前为止,它们只是相当模糊的建议


编辑:根据注释添加了一个示例

我可以想象你想要达到什么效果。但这可能相当困难。一个简单的解决方案可能至少与您想要的接近(使用来自的类的简化版本)


对于细线,您当前正在呼叫

g2D.drawLine(oldX, oldY, currentX, currentY);
g2D.fillRect(currentX, currentY, getXSize(), getYSize());
而对于粗线,你只是在打电话

g2D.drawLine(oldX, oldY, currentX, currentY);
g2D.fillRect(currentX, currentY, getXSize(), getYSize());
这意味着当您快速移动鼠标时,上一个鼠标位置和新鼠标位置之间将没有连接

一个简单的解决方案是将第二个调用改为

g2D.setStroke(new BasicStroke(getXSize()));
g2D.drawLine(oldX, oldY, currentX, currentY);
但是,对于当前的绘制代码,有几个可能的改进。您应该考虑不要基于一组布尔标志来决定如何绘制。相反,您可以考虑一些类似于PoN/COD>接口的接口,通过使用不同的接口实现,可以在不同的笔之间切换。 前面已经提到,您可以将这些点组合成一个
路径2D
,然后绘制该路径。这是一个很好的建议,你也应该明确考虑:它提供了一些不错的可能性。例如,您可以定义一个
笔划
,并使用任意笔形状创建一个“笔划形状”

然而,所有这些更改都可能需要相当大的重构,因此,到目前为止,它们只是相当模糊的建议


编辑:根据注释添加了一个示例

我可以想象你想要达到什么效果。但这可能相当困难。一个简单的解决方案可能至少与您想要的接近(使用来自的类的简化版本)


使用一个
多边形
或某种
形状
,并不断地将点添加在一起,并用油漆代替表示线中每个点的正方形…或者你可以在点之间画线…因此,你可以使用
绘制线
而不是
填充线
…使用
多边形
或某种形状
Shape
并继续将点添加在一起,并使用油漆代替表示线中每个点的正方形…或者您可以在点之间绘制线…因此,您可以使用
drawLine
代替
fillRect
…感谢您的宝贵建议。我对整个绘画理念和图形课程都比较陌生。我一点也不介意重构。如果你看到我的另一门绘画课,那就更糟了——哈哈。无论如何谢谢你!你好,很抱歉打扰你,但是这个解决方案在很大程度上解决了我的问题。但是,我如何设置它,使笔划像夏比?目前,我的代码看起来是这样的:g2D.fillRect(currentX,currentY,getXSize()/2,getYSize()+15);提前谢谢@加藤我添加了一个编辑-这可能很难,至少当你想让它在通话中看起来“漂亮”的时候…谢谢你的建议。我对整个绘画理念和图形课程都比较陌生。我一点也不介意重构。如果你看到我的另一门绘画课,那就更糟了——哈哈。无论如何谢谢你!你好,很抱歉打扰你,但是这个解决方案在很大程度上解决了我的问题。