0

我目前能够通过添加一个扩展 JComponent 的组件在 Java 中绘制矩形、椭圆和线条,在其中我修改了一个 paintComponent 方法:

public class myComponent extends JComponent
{
   public void paintComponent(Graphics g)
   {
    /* do simple draw stuff */
   }
}

我也知道如何让我的类扩展 JApplet 或 JPanel,然后使用绘画方法进行绘制:

public class myClass extends JPanel
{
   public void paint(Graphics g)
   {
    /* do simple draw stuff */
   }
}

但是,这两种方法都不允许我向它们传递参数。在多帧动画精灵的情况下,我可以想象有一些外部变量,它读取以确定帧号,然后在内部仅根据该帧号绘制适当的“精灵”内容,但我希望能够直接将帧号传递给它。不幸的是,我不仅不知道它是从哪里调用的,我也不知道它需要作为输入的 Graphics g 在哪里。

可能有更好的方法来完成我想要的,直接与绘图例程通信,告诉它在我想要的时候只绘制我想要的,但我不知道如何实现这一点。

如果这样的方法是可能的,那将如何做?如果使用现有的paint 或paintComponent 方法更好,我怎样才能最好地将附加信息传递给它们?


显然我并不清楚我问了什么。我希望有一个组件或其他实体,它有自己的paintComponent 或paint 方法,在其内部,基于传递给它的frameNumber 参数,或者显然更可能是一个类属性,例如它可以的frameNumber访问时,该方法确定要绘制精灵的哪一帧。

但重要的是,我希望能够在帧号更改时重新调用paint 或paintComponent 来重绘精灵。我最大的困惑在于不知道如何重新调用该方法,据我所知,只有在调整框架大小或以其他方式重绘时才会调用该方法。

那么,如何逐帧重绘我的组件/对象/实体?

4

3 回答 3

1

我可以想象有一些外部变量,它读取以确定帧号,然后在内部根据该帧号仅绘制适当的“精灵”内容

你的类需要有一些内部状态,即实例变量。

然后,您可以检查paint方法中的那些。

于 2013-07-10T23:39:34.623 回答
1

想想“成员变量”:

public class MyClass extends JPanel {

   private final int frameNumber;

   public MyClass() { 
       this(0);
   }

   public MyClass(int f) { 
       this.frameNumber = f; 
   }

   public void paint(Graphics g)
   {
       if (this.frameNumber == x) {
        /* do simple draw stuff */
       }
   }
}
于 2013-07-10T23:39:52.407 回答
1

首先,不要覆盖paint,使用paintComponent.

其次,您需要定义某种模型来记录所有图形对象的状态。当paintComponent被调用时,您需要渲染该状态。与其尝试将参数传递给绘制方法,您应该有一个方法允许绘制方法访问getModel在较早时间传递给组件的模型(即)。

然后更新引擎将更新模型,组件将绘制该模型

例如......按下键时使用计时器

于 2013-07-10T23:41:58.803 回答