在JFrame中从类中绘制许多相同的对象

时间:2014-05-20 18:36:33

标签: java swing arraylist jpanel graphics2d

答案由我撰写在问题的底部

我想在一个框架中获得很多'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;
    }

1 个答案:

答案 0 :(得分:0)

好的,我能看到的另一件事是你的StartGame()只被初始化一次。因此,您的new Timer只会被调用一次。因为它是导致创建ActionListener的计时器,所以它只创建并运行一次,因此永远不会到达创建另一个矩形的阶段。 actionPerformed()方法只在程序中运行一次,因为没有动作或循环使其再次运行。