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);
但是,对于当前的绘制代码,有几个可能的改进。您应该考虑不要基于一组布尔标志来决定如何绘制。相反,您可以考虑一些类似于路径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);
但是,对于当前的绘制代码,有几个可能的改进。您应该考虑不要基于一组布尔标志来决定如何绘制。相反,您可以考虑一些类似于路径2D
,然后绘制该路径。这是一个很好的建议,你也应该明确考虑:它提供了一些不错的可能性。例如,您可以定义一个笔划
,并使用任意笔形状创建一个“笔划形状”
然而,所有这些更改都可能需要相当大的重构,因此,到目前为止,它们只是相当模糊的建议
编辑:根据注释添加了一个示例 我可以想象你想要达到什么效果。但这可能相当困难。一个简单的解决方案可能至少与您想要的接近(使用来自的类的简化版本)
使用一个
多边形
或某种形状
,并不断地将点添加在一起,并用油漆代替表示线中每个点的正方形…或者你可以在点之间画线…因此,你可以使用绘制线
而不是填充线
…使用多边形
或某种形状Shape
并继续将点添加在一起,并使用油漆代替表示线中每个点的正方形…或者您可以在点之间绘制线…因此,您可以使用drawLine
代替fillRect
…感谢您的宝贵建议。我对整个绘画理念和图形课程都比较陌生。我一点也不介意重构。如果你看到我的另一门绘画课,那就更糟了——哈哈。无论如何谢谢你!你好,很抱歉打扰你,但是这个解决方案在很大程度上解决了我的问题。但是,我如何设置它,使笔划像夏比?目前,我的代码看起来是这样的:g2D.fillRect(currentX,currentY,getXSize()/2,getYSize()+15);提前谢谢@加藤我添加了一个编辑-这可能很难,至少当你想让它在通话中看起来“漂亮”的时候…谢谢你的建议。我对整个绘画理念和图形课程都比较陌生。我一点也不介意重构。如果你看到我的另一门绘画课,那就更糟了——哈哈。无论如何谢谢你!你好,很抱歉打扰你,但是这个解决方案在很大程度上解决了我的问题。