我将如何着手创建自定义图形 class 供 paintComponent 使用?

How would I go about creating a custom graphics class for paintComponent to use?

我一直在四处寻找以更好地理解我正在尝试做的事情,但运气不佳。我假设答案比我意识到的要简单得多。

我正在为 class 项目制作棋盘游戏,并且正在使用 JPanel 来显示图形(很明显)。在 paintComponent 中,我不想只在一个位置创建所有内容,而是想将我的图形外部化到一个 class 中,我可以在 paintComponent 中简单地对其进行实例化。尽量保持逻辑上的分离和清洁。

我的 Graphics2D 看起来需要一个 class 来为其 .add() 方法实现 Shape。如果这是正确的,那么假设我实现了 Shape,那么 paintComponent 在绘制我的形状时在寻找什么?我需要任何特定的方法还是只使用构造函数?或者,我所有的图形 class 是否应该只使用 JPanel 并使用它们自己的 paintComponent?这感觉有点占用内存,对我来说是错误的。

到目前为止我看到的所有例子都是一样的...

public void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;

  // Create shapes here which combine to form
  // a larger object...
  g2.add(a circle...);
  g2.add(a rectangle...);
  g2.add(other shapes...);
}

而我真正想做的是...

public void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;

  // Intantiate robust graphics object from external class.
  g2.add(graphicsObject);
}

所以我最终只是按顺序添加项目,游戏板表面层,上面的瓷砖,然后是用于放置在瓷砖中的游戏代币。

非常欢迎智慧的话语和优秀的链接。提前致谢。

一种绘画方法,仅供绘画使用。它应该绘制 class 的属性。在这种情况下,属性将是您要绘制的形状。因此,您 class 需要一种方法来指定要绘制的形状。您不想在绘画方法中创建形状。

您想:

  1. 创建一个 ArrayList 来保存要绘制的形状。

  2. 然后在 paintComponent() 方法中,您只需遍历列表并绘制每个形状。

基本代码如下:

// Create List containing Shapes to be painted

List<Shape> shapes = new ArrayList<Shape>();
shapes.add( circle ):
shapes.add( rectangle );

// The custom painting code might look like:

protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g.create();

    for (Shape info : shapes)
    {
        g2d.fill( info.getShape() );
    }

    g2d.dispose();
}

所以你 class 也可能有一个 addShape(...) 方法来更新形状列表。

有关此方法的工作示例,请查看 Custom Painting Approaches 中的 DrawOnComponent 示例。此示例仅绘制矩形,但它演示了绘制方法。