【问题标题】:How would I go about creating a custom graphics class for paintComponent to use?我将如何创建一个自定义图形类供paintComponent 使用?
【发布时间】:2016-02-16 10:40:31
【问题描述】:

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

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

我的 Graphics2D 看起来想要一个为其 .add() 方法实现 Shape 的类。如果这是正确的,那么假设我实现了 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);
}

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

非常欢迎智慧之言和优秀链接。提前致谢。

【问题讨论】:

    标签: java swing graphics awt paintcomponent


    【解决方案1】:

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

    你想:

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

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

    基本代码如下:

    // 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();
    }
    

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

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

    【讨论】:

    • 我确实想到了用列表做类似的事情。我希望 JComponent 或某些接口能够为我提供这种级别的功能,但从我所看到的任何地方来看,它似乎都不是这样。图形编程对我来说还是有点陌生​​,所以我想我应该质疑我的方法是否适合开始。鉴于我还没有找到这个的单一实现,这让我有点怀疑我的逻辑。
    • @ScotMatson I was hoping that JComponent or some interface would afford me this level of functionality - 此示例使用 Shape 接口。您可以轻松地创建自己的接口,该接口定义要为您的自定义对象调用的绘画方法。此处发布的代码基本上是执行您想要的所有代码。我不确定你在质疑你的逻辑的哪一部分。您需要一个数据结构来存储要绘制的对象、一个方法来添加对象到该数据结构和绘制代码来绘制每个对象。
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多