【问题标题】:Drawing a lot of same objects from a class in JFrame从 JFrame 中的一个类中绘制许多相同的对象
【发布时间】:2014-07-09 03:59:58
【问题描述】:

答案是我在问题底部写的

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

吃课:

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;
    }

【问题讨论】:

  • 你把它们都画在同一个地方?
  • 你确定所有Ates都有不同的xy吗?你确定startGame.alist 有多个元素吗?
  • 向我们展示alist 以及它是如何创建的
  • 我编辑了问题。
  • 如果您不打算对它做任何事情,那么将a 作为参数传递给构造函数有什么意义?

标签: java swing arraylist jpanel graphics2d


【解决方案1】:

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

【讨论】:

  • 正如您在 -edited- 问题中看到的那样,它不应该每次都相同。我错了吗?
  • 不,你是对的,每次调用该方法都会生成一个不同的数字 - 我现在很难过
  • 现在,它正在向左移动。对象不多。
  • @user2670532 这是我能看到的唯一可能导致问题的其他事情。如果不是这样,那么我真的很难过,希望其他人能够详细说明它
  • 我确信它是一个循环。我在“actionPerformed”中写了变量的值,如果有一个矩形,由于相同的功能,它运行良好。
猜你喜欢
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多