paintComponent不稳定

时间:2013-06-22 16:51:48

标签: java swing jpanel paintcomponent

我正在制作游戏,虽然我主要是在逻辑上工作,但我有一个简单,快速制作的绘制方法:

   public class Draw extends JPanel {

    private static final long serialVersionUID = 1L;

//  BufferedImage heroitext;
    Hero hero;
    Vector<Enemy> enemies;
    Vector<Bullet> ammo;
    Vector<Terrain> terrains;

    public Draw() {
//      (int)try {
//          heroitext = ImageIO.read(getClass().getResource("/images/circulo.png"));
//      } catch (IOException e) {
//          e.printStackTrace();
//      }
    }

    public void render(Level lvl) {
        hero = lvl.getHero();
        ammo = lvl.getAmmo();
        enemies = lvl.getEnemies();
        terrains = lvl.getTerrains();
        repaint();
    }


    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        System.out.println("drawing");

        //draw Hero
        g.drawRect((int)hero.getX(), (int)hero.getY(), hero.getWidth(), hero.getHeight());

        //draw Enemies
        for(int i=0; i<enemies.size(); i++)
        {
            if(!enemies.get(i).isToKill()) g.drawRect((int)enemies.get(i).getX(), (int)enemies.get(i).getY(), enemies.get(i).getWidth(), enemies.get(i).getHeight());
            for(int j=0; j<enemies.get(i).getAmmo().size(); j++)
            {
                g.drawRect((int) enemies.get(i).getAmmo().get(j).getX(), (int)enemies.get(i).getAmmo().get(j).getY(), enemies.get(i).getAmmo().get(j).getWidth(), enemies.get(i).getAmmo().get(j).getHeight());
            }
        }

        //draw Ammo
        for(int i=0; i<ammo.size(); i++)
        {
            g.drawRect((int)ammo.get(i).getX(), (int)ammo.get(i).getY(), ammo.get(i).getWidth(), ammo.get(i).getHeight());
        }

        //draw Terrains
        for(int i=0; i<terrains.size(); i++)
        {
            g.drawRect((int)terrains.get(i).getX(), (int)terrains.get(i).getY(), terrains.get(i).getWidth(), terrains.get(i).getHeight());
        }
    }
}

它通常效果很好,但有时,即使我不更改代码,一些运行会给我一个白色屏幕,并且有一些println我发现尽管代码达到了repaint(),但paintComponent方法仍然是'总是打电话。

正如我所说,这种情况有时只会发生,而且看起来不可预测。

另一件事是当我向敌人向量添加大约50000个敌人时,无论我尝试多少次运行,都不会调用paintComponent。根据我的研究,有些人说这是因为如果另一个面板已经等待绘制(或类似的东西),java将不会费心绘制面板但是这对第一种情况没有意义,因为我没有改变任何代码。

有人可以解释一下实际发生了什么以及如何正确修复它吗?

0 个答案:

没有答案