如何删除JPanel对象? [英] How to delete an JPanel Object?

查看:339
本文介绍了如何删除JPanel对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要创建一个小游戏",类似于2D AirForce Shooter. 因此,我在删除未使用的敌人时遇到问题.

Im on to create a little "game", something like an 2d AirForce Shooter. So, i have a problem with deleting unused enemys.

敌人是一个简单的JPanel,在主逻辑中另存为数组List.

An Enemy is an simple JPanel, which is saved in the main logic as an array List.

public static ArrayList<Enemy> enemys = new ArrayList<Enemy>();

敌人运行逻辑执行以下操作:

The Enemy run logic does the following:

while(!destroyed){
        if(Game.running){
            x--;
            if(getBounds().intersects(Field.player.getBounding())){
                Player.death = true;
            }
            if(x < 0){
                Field.deleteEnemy(this);
            }
            setBounds((int) x, (int) y, 100, 50);
            try{Thread.sleep(10);}catch(InterruptedException e){}
        }
    }

因此,您似乎似乎已经在尝试调用deleteEnemy方法,并给它未使用的敌人.

So you can seem there i already tried to call the method deleteEnemy, and just give it the unused Enemy.

但这是不可能的-当我这样做时:

But it isnt possible - when i just do this:

    public static void deleteEnemy(Enemy e){
    System.out.println("test");
    enemys.remove(e);
}

它将刚刚从列表中删除,但是主JPanel中存在coninues. 我不能说

It will be just removed from the list, but coninues existing on the Main JPanel. And i cannot say

remove(e);

因为然后我尝试在静态中调用非静态函数. 所以,我怎么删除一个敌人?有人知道吗?

Because then i try to call a non static function in a static. So, how could i delete an Enemy? Someone knows?

感谢帮助!

漏洞代码:(Game.java)

The hole code: (Game.java)

然后,Enemy.java:

And, Enemy.java:

package Game;

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Field extends JPanel implements Runnable{


    public static Player player = new Player();
    public static ArrayList<Enemy> enemys = new ArrayList<Enemy>();
    private Thread moveBackground = new Thread(this);
    private boolean bgMoving = false;
    public static boolean addMob = false;
    private int x = 0;
    private int bgSpeed = -1;


    public Field(){
        setBounds(0, 0, 800, 600);
        setFocusable(true);
        setLayout(null);
        addKeyListener(new Handler());

        add(player);
    }

    public void paintComponent(Graphics g){
        Field.super.paintComponent(g);
        g.drawImage(Images.images[0], x, 0, this);
    }

    public static void deleteEnemy(Enemy e){
        System.out.println("test");
        enemys.remove(e);
    }

    public void run(){
        while(!Player.death){
            if(bgMoving){
                bgMoving = true;
                x += bgSpeed;
                if(x < -(Images.images[0].getWidth(this) - this.getWidth() - 20)){
                    bgMoving = false;
                }
                repaint();
                try { Thread.sleep(20); } catch (InterruptedException e) {}
            }
            if(addMob){
                enemys.add(new Enemy());
                add(enemys.get(enemys.size() - 1));
                addMob = false;
            }
        }
        JOptionPane.showMessageDialog(null, "DIED!");
    }

    public class Handler extends KeyAdapter {

        public void keyPressed(KeyEvent e) {
            player.KeyPressed(e);
            if(!bgMoving){
                if(Game.running){
                    bgMoving = true;
                    if(moveBackground.getState().toString() == "NEW"){
                        moveBackground.start();
                    }
                }
            }
        }

        public void keyReleased(KeyEvent e) {
            player.KeyReleased(e);
        }

    }

}

然后,Enemy.java:

And, Enemy.java:

package Game;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Enemy extends JPanel implements Runnable{

    Thread t = new Thread(this);
    private double x = Game.width();
    private double y = Math.random() * Game.height();
    private double xF = 0, yF = 0;
    private boolean destroyed = false;

    public Enemy(){
        setBounds((int) x, (int) y, 100, 50);
        setOpaque(false);
        t.start();
    }

    public void paintComponent(Graphics g){
        Enemy.super.paintComponent(g);
        g.setColor(Color.GREEN);
        g.drawImage(Images.images[2], 0, 0, this);
    }

    public void run() {
        while(!destroyed){
            if(Game.running){
                x--;
                if(getBounds().intersects(Field.player.getBounding())){
                    Player.death = true;
                }
                if(x < 0){
                    Field.deleteEnemy(this);
                }
                setBounds((int) x, (int) y, 100, 50);
                try{Thread.sleep(10);}catch(InterruptedException e){}
            }
        }
    }
}

推荐答案

删除后,您将需要调用

After removing you will need to call revalidate() and repaint()

这篇关于如何删除JPanel对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆