我正在为一个项目制作一个绘图应用程序并遇到问题。
我的模型存储两个圆形和方形对象的ArrayLists。 (每次绘制一个,都会存储)
我的GUI上还有一个JSlider,可以使用g2d.setStroke(new BasicStroke(sliderValue))来改变笔划的粗细;
现在,问题在于,当更改厚度并绘制新形状时,画布上任何现有形状的厚度也会发生变化。
如何将笔划粗细个性化为一个形状,并确保它在绘制后不会发生变化?
抱歉,如果它有点模糊。我想不要在网上发布代码,因为它是一项任务。
谢谢!
答案 0 :(得分:1)
我的模型存储两个圆形和方形对象的数组列表。
您不需要两个ArrayLists。
你只需要一个,然后你可以存储一个Shape对象,它是一个圆形,正方形或任何其他形状。
查看Playing With Shapes以获取有关此概念的更多一般信息,包括对基本绘画代码的建议。
当厚度改变并且绘制新形状时,画布上任何现有形状的厚度也会改变。
这意味着每次重新绘制组件时都要重新绘制ArrayLists中的Shapes。
因此,在ArrayList中,您需要存储一个包含两条信息的Custom对象:1)要绘制的Shape和2)用于绘制Shape的Stroke。然后,当您遍历ArrayList时,为每个绘制的Shape重置Stroke。
查看Custom Painting Approaches中的Draw On Component
示例,了解此方法的示例。
或Draw On Image
方法显示如何绘制到BufferedImage,因此您甚至不需要ArrayLists来跟踪绘制的形状。
您使用的方法取决于您的确切要求。
答案 1 :(得分:0)
如何将笔划粗细个性化为一个形状,并确保它在绘制后不会改变?
您可以在更改之前存储旧笔划,在绘制最新项目之前更改图形对象的笔划,然后将笔划恢复为原始笔划。
或者您可以创建Graphics对象的副本,更改其Stroke,并使用它绘制新项目,在完成后将其处理掉。
或者您可以绘制旧项目,其中Stroke不应更改为由同一Graphics对象显示的BufferedImage。
对不起,如果它有点模糊。我想不要在网上发布代码,因为这是一项任务。
没问题 - 但是如果你想要更具体的代码帮助,你需要显示相关的代码,最好是你的Minimal, Complete, and Verifiable Example Program(请查看链接)。