【问题标题】:Custom shape in JavaJava中的自定义形状
【发布时间】:2012-03-03 17:33:48
【问题描述】:

我想要实现的是这样的:

 public void paint(Graphics g) {
    Graphics2D ga = (Graphics2D) g;      
    MyShape c = new MyShape();
    ga.draw(c);
}

我希望 MyShape 类包含绘制带有数字的圆圈所需的信息。

所以,我想我需要创建某种容器/组件,并在其中绘制我需要的内容(圆圈和数字),然后将其进一步传递给我上面粘贴的方法。

问题是我不知道要扩展什么类......以及故事的其余部分。

【问题讨论】:

  • 扩展Object。至于“故事的其余部分”,我不知道,也许当你问一个具体问题时会变得更清楚。 ..或任何问题,就此而言。
  • 毕竟我没有扩展或实现任何东西。我刚刚将 Graphics 对象从我的主类传递到对象本身。
  • “毕竟我没有扩展.. 任何东西。” 是的,你做到了。自定义类隐式扩展Object。调用toString()hashCode()方法确认。 ;)

标签: java swing awt paintcomponent


【解决方案1】:

形状就是这样:一个形状。圆是一种形状。矩形是一种形状。但是里面有数字的圆圈不是形状。我的猜测是你实际上想要这样的东西:

public class CircleWithNumberInside extends JComponent {
    @Override
    protected void paintComponent(Graphics g) {
        // TODO draw a circle, and draw a number inside it.
    }
}

【讨论】:

  • Graphics2D 的 draw 方法只接受 Shape 对象;我会尝试实现Shape接口
  • 这个想法是,您不会将对象传递给 Graphics2D,以便图形绘制对象。反之亦然:Swing 将 Graphics2D 传递给组件,以便它们在 Graphics2D 上绘制自己。
【解决方案2】:

您当然可以自己实现Shape 接口,但是如果您可以使用现有的子类,例如Ellipse2D,则没有必要。只需为widthheight 构造相同的值即可。有一个示例 here 展示了如何在 Ellipse2D.Double 中居中任意字形。

【讨论】:

    【解决方案3】:

    您必须扩展 Shape 类,您必须在其内部覆盖paintComponent,以便 Graphics2D 对象知道要绘制什么。

    【讨论】:

    • Shape是一个接口,它有很多我不需要的抽象方法
    • Shape 接口没有可覆盖的paintComponent 方法,这是有道理的,因为这是JComponent 及其子项的方法,而不是Shape。相反,Shape 具有允许 Graphics2D 对象绘制或填充它的代码。
    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多