【问题标题】:Java Swing moving java.awt.ShapeJava Swing 移动 java.awt.Shape
【发布时间】:2015-08-05 10:05:53
【问题描述】:

我们有一个显示某种地图的应用程序。这个Swing应用主要是用java.awt.Graphics2D#draw(Shape)绘制了一组java.awt.Shapes,一切都很好。

现在,我必须扩展这个应用程序以允许我们的用户编辑(移动形状)地图。但是java.awt.Shapes 上没有translatemove 方法。所以我不能改变形状的位置(java.awt.Point)。

我试图覆盖java.awt.Shape#getPathIterator 以应用与形状位置匹配的翻译。但这很棘手,因为这个方法已经接受了我必须合并的转换,而且为了正确,PathIterator 应该从(0, 0) 开始,因为它是相对于形状位置的。

不管怎样,这行不通,因为Graphics2D似乎并不总是使用这种方法来绘制java.awt.Shape

所以现在,我感到有些失落。另一种解决方案可能是让形状自己绘制,但随后我必须重写应用程序的一部分。这不是问题,但我必须知道哪个可能是最好的解决方案:

  1. 想办法移动java.awt.Shape 似乎是最好的解决方案,但我不知道该怎么做。

  2. 将应用更改为具有自绘形状 可能很好,但我必须计算 myslef contains 和其他更复杂的方法。

【问题讨论】:

  • 你检查过 AffineTransform 吗?
  • 要么翻译 Graphics 上下文以绘制 Shape(使用 AffineTransform),要么使用 AffineTransform 使用 createTransformedShape 方法翻译形状

标签: java swing drawing java-2d


【解决方案1】:

但是java.awt.Shapes 上没有translatemove 方法。

AffineTransform.createTransformedShape(Shape),其中:

返回一个新的 Shape 对象,该对象由指定的 Shape 的几何图形在经过此变换后进行变换。

当然还有Graphics2D.translate(x,y)..

Graphics2D 上下文的原点转换为当前坐标系中的点 (x, y)。 ..

【讨论】:

  • 谢谢。 GraphicsD.translate(x, y) 不起作用,因为形状的路径是绝对的。因此,如果我翻译和绘制,那么形状应该是错位的。
  • "GraphicsD.translate(x, y) 不会工作.." 当然可以!但是使用createTransformedShape(Shape) 更容易,因为您不需要在绘制每个形状之间将Graphics2D 重置为原点。
【解决方案2】:

您可以根据您的 Shape 创建 Area 并调用 transform() 传递带有翻译坐标的 AffineTransform。

Area a=new Area(sourceShape);
AffineTransform at=new AffineTransform();
at.translate(horizontalShift, verticalShift);
Shape transformedShape=a.transform(at);

尚未测试

【讨论】:

  • AffineTransform 有一个createTransformedShape 方法,它返回一个Shape,这非常容易;)
【解决方案3】:

@AndrewThompson 的解决方案似乎是最好的解决方案。我要试一试。

对于那些感兴趣的人(因为我必须进步)。我创建了一个扩展 java.awt.Shape 的接口,并为他的 location 属性设置了一个设置器。 每个特定形状都必须实现更新其位置所需的代码,但这比必须移动任何形状要容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多