Java 如何创建一个自定义图形类供paintComponent使用?

Java 如何创建一个自定义图形类供paintComponent使用?,java,swing,graphics,awt,paintcomponent,Java,Swing,Graphics,Awt,Paintcomponent,我一直在四处寻找,想更好地了解我想做什么,但运气不好。我想答案比我想象的要简单得多 我正在为一个班级项目制作一个棋盘游戏,并使用JPanel来显示图形(显然)。在paintComponent中,我不想只在一个位置创建所有东西,而是想将我的图形外部化为一个类,我可以在paintComponent中简单地实例化它。尽可能保持所有东西在逻辑上分离和干净 我的Graphics2D看起来需要一个为其.add()方法实现Shape的类。如果这是正确的,那么,假设我实现了形状,当它绘制我的形状时,paintC

我一直在四处寻找,想更好地了解我想做什么,但运气不好。我想答案比我想象的要简单得多

我正在为一个班级项目制作一个棋盘游戏,并使用JPanel来显示图形(显然)。在paintComponent中,我不想只在一个位置创建所有东西,而是想将我的图形外部化为一个类,我可以在paintComponent中简单地实例化它。尽可能保持所有东西在逻辑上分离和干净

我的Graphics2D看起来需要一个为其.add()方法实现Shape的类。如果这是正确的,那么,假设我实现了形状,当它绘制我的形状时,paintComponent在寻找什么?我是否需要任何特定的方法,或者仅仅使用构造函数?或者,我的所有图形类都应该只使用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);
}
所以我最终只需要按顺序添加项目,一个游戏板表面层,上面的瓷砖,然后在瓷砖中放置游戏令牌


智慧的话语和优秀的链接是最受欢迎的。提前感谢。

绘画方法仅适用于绘画。它应该绘制类的属性。在这种情况下,属性将是要绘制的形状。因此,类需要一个方法来指定要绘制的形状。您不希望在绘制方法中创建形状

您想:

  • 创建一个ArrayList以保存要绘制的形状

  • 然后在
    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();
    }
    
    //创建包含要绘制的形状的列表
    列表形状=新建ArrayList();
    形状。添加(圆形):
    添加(矩形);
    //自定义绘制代码可能如下所示:
    受保护组件(图形g)
    {
    超级组件(g);
    Graphics2D g2d=(Graphics2D)g.create();
    用于(形状信息:形状)
    {
    g2d.fill(info.getShape());
    }
    g2d.dispose();
    }
    
    因此,类还可能有一个
    addShape(…)
    方法来更新形状列表


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

    绘制方法仅用于绘制。它应该绘制类的属性。在这种情况下,属性将是要绘制的形状。因此,类需要一个方法来指定要绘制的形状。您不希望在绘制方法中创建形状

    您想:

  • 创建一个ArrayList以保存要绘制的形状

  • 然后在
    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();
    }
    
    //创建包含要绘制的形状的列表
    列表形状=新建ArrayList();
    形状。添加(圆形):
    添加(矩形);
    //自定义绘制代码可能如下所示:
    受保护组件(图形g)
    {
    超级组件(g);
    Graphics2D g2d=(Graphics2D)g.create();
    用于(形状信息:形状)
    {
    g2d.fill(info.getShape());
    }
    g2d.dispose();
    }
    
    因此,类还可能有一个
    addShape(…)
    方法来更新形状列表


    有关此方法的工作示例,请查看中的
    DrawOnComponent
    示例。这个例子只画矩形,但它展示了绘画的方法。

    我确实想过用列表做类似的事情。我希望JComponent或某些接口能够为我提供这种级别的功能,但从我所看到的任何地方来看,似乎都不是这样。图形编程是我对still有点陌生的东西,所以我想我应该质疑我的方法是否适合开始。考虑到我还没有找到一个这样的实现,这让我有点怀疑我的逻辑。@ScotMatson
    我希望JComponent或某个接口能为我提供这种级别的功能
    ——这个例子使用了Shape接口。您可以轻松创建自己的接口,该接口定义要为自定义对象调用的绘制方法。这里发布的代码基本上就是做你想做的事情所需要的所有代码。我不知道你在质疑你的逻辑的哪一部分。你需要一个数据结构来存储要绘制的对象,一个方法来将对象添加到该数据结构中,并需要绘制代码来绘制每个对象。我希望JComponent或某些接口能够为我提供这种级别的功能,但从我所看到的任何地方来看,似乎都不是这样。图形编程是我对still有点陌生的东西,所以我想我应该质疑我的方法是否适合开始。考虑到我还没有找到一个这样的实现,这让我有点怀疑我的逻辑。@ScotMatson
    我希望JComponent或某个接口能为我提供这种级别的功能
    ——这个例子使用了Shape接口。您可以轻松创建自己的接口,该接口定义要为自定义对象调用的绘制方法。这里发布的代码基本上就是做你想做的事情所需要的所有代码。我不知道你在质疑你的逻辑的哪一部分。您需要一个数据结构来存储要绘制的对象,需要一个方法来将对象添加到该数据结构中,需要一个绘制代码来绘制每个对象。