答案由我撰写在问题的底部
我想在一个框架中获得很多'Ates'对象。我尝试了很多例子,但总是失败。
在这种情况下,我希望看到许多将要离开的矩形。然而,只有一个,它越来越快......
它不会同时显示多个对象。你能告诉我这是什么问题吗?
我使用了这段代码:
public class GamePanel extends JPanel
{
public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.BLACK);
for(Ates a1 : StartGame.alist) // alist is an arraylist for Ates class objects
{
g.fillRect(a1.getX(), a1.getY(), 20, 20);
}
...
创建示例:
public void sentAtes()
{
r = rand.nextInt(471)+60;
Ates a = new Ates(r);
alist.add(a);
}
Ates课程:
public Ates(int a)
{
x = 700;
y = a;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public void setX( int a )
{
x = a;
}
public void setY( int a )
{
y = a;
}
StartGame类:
public class StartGame extends JFrame implements KeyListener, ActionListener
{
protected static ArrayList<Ates> alist = new ArrayList<Ates>();
public static int cen = 0;
...
public StartGame()
{
jp = new GamePanel();
add(jp);
...
int delay = 10;
ActionListener taskPerformed = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
cen++;
if(cen > 50)
{
cen = 0;
sentAtes();
}
for(Ates a1 : alist)
{
a1.setX(a1.getX()-1);
}
repaint();
}
};
new Timer(delay,taskPerformed).start();
...
信息:如果只有一个对象,它会按预期继续运行。
回答我的问题。
在Ates
课程中,您不应将static
字用于变量,并使用this.
前缀进行设置。
这应该可行。
public class Ates extends JFrame
{
protected int x;
protected int y;
public Ates(int a)
{
this.x = 700;
this.y = a;
}
答案 0 :(得分:0)
好的,我能看到的另一件事是你的StartGame()
只被初始化一次。因此,您的new Timer
只会被调用一次。因为它是导致创建ActionListener
的计时器,所以它只创建并运行一次,因此永远不会到达创建另一个矩形的阶段。 actionPerformed()
方法只在程序中运行一次,因为没有动作或循环使其再次运行。