我现在可以通过添加扩展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。我最大的困惑在于不知道如何重新调用该方法,据我所知,只有在调整帧大小或重新绘制帧时才调用该方法。
答案 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