Jr Java-er想要将Params传递给Paint

时间:2013-07-10 23:36:51

标签: java graphics jpanel paint

我现在可以通过添加扩展JComponent的组件来在Java中绘制矩形,椭圆和线条,我在其中修改paintComponent方法:

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

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

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

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

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

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


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

重要的是,我希望能够在帧号更改时重新调用paint或paintComponent来重绘sprite。我最大的困惑在于不知道如何重新调用该方法,据我所知,只有在调整帧大小或重新绘制帧时才调用该方法。

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

3 个答案:

答案 0 :(得分:1)

  

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

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

然后,您可以在paint方法中检查这些内容。

答案 1 :(得分: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 */
       }
   }
}

答案 2 :(得分:1)

首先,请勿覆盖paint,使用paintComponent

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

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

举个例子...... Use a timer when a key is pressed