Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用线程显示动画_Java_Multithreading_Swing - Fatal编程技术网

Java 用线程显示动画

Java 用线程显示动画,java,multithreading,swing,Java,Multithreading,Swing,我想用线程同时显示多个动画。 但它不起作用,第二个动画在第一个动画结束时开始。 我正在使用线程,但可能是错误的方式,因为我是初学者 这是我的密码: public class Board extends JPanel{ Mouse mouse; ArrayList<Explosion> explosions; public Board() { mouse = new Mouse(this);

我想用线程同时显示多个动画。 但它不起作用,第二个动画在第一个动画结束时开始。 我正在使用线程,但可能是错误的方式,因为我是初学者 这是我的密码:

public class Board extends JPanel{

    Mouse mouse;
    ArrayList<Explosion> explosions;

    public Board() {            
        mouse = new Mouse(this);        
        explosions = new ArrayList();       
        setDoubleBuffered(true);         
        this.addMouseListener(mouse);
    }

    public void addExplosion(Explosion e) {
        explosions.add(e);
        new Thread(explosions.get(explosions.indexOf(e))).start();
    }

    public void removeExplosion(Explosion e) {
        explosions.remove(e);
    }

    public void paint(Graphics g) {
        super.paint(g);

        for(int i=0; i<explosions.size(); i++) {
            explosions.get(i).paintComponent(g);
        }

        Graphics2D g2d = (Graphics2D)g;
        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }
}


public class Explosion extends JPanel implements Runnable{

    private BufferedImage img;

    final int width = 320;
    final int height = 320;
    final int rows = 5;
    final int cols = 5;

    private int x,y;

    private int cursor;

    BufferedImage[] sprites = new BufferedImage[rows * cols];

    Board board;

    public Explosion(Board board,int x, int y) {
        this.board = board;
        this.x = x;
        this.y = y;

        try {
            try {
                this.img = ImageIO.read(new File((this.getClass().getResource("files/explosion2.png")).toURI()));
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        cursor = 0;

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                sprites[(i * cols) + j] = img.getSubimage(
                    j * (width/rows),
                    i * (height/cols),
                    width/rows,
                    height/cols
                );
            }
        }
    }

    public void run() {     
        ActionListener taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
               cursor++;
            }
        };

        Timer timer = new Timer(50, taskPerformer);

        while(cursor < ((rows*cols)-1)) {           
            timer.start();
            board.repaint();                
        }
        timer.stop();

        board.removeExplosion(this);
    }

    public void paintComponent(Graphics g){
        Graphics2D g2d = (Graphics2D)g;
        g2d.drawImage(sprites[cursor], x, y, this);
        g.dispose();    
    }   
}
公共类板扩展JPanel{
小鼠;
阵列爆炸;
公共委员会({
鼠标=新鼠标(此);
爆炸=新的ArrayList();
setDoubleBuffered(真);
这是addMouseListener(鼠标);
}
公共空间附加爆炸(爆炸e){
增加(e);
新线程(exploments.get(exploments.indexOf(e)).start();
}
公共空间移除爆炸(爆炸e){
拆除(e);
}
公共空间涂料(图g){
超级油漆(g);

对于(int i=0;i任何更新GUI的代码都应该在与GUI相关联的线程上运行。要从不同的线程执行此操作,例如在您的案例中,您需要使用
SwingUtilities.InvokeLater

SwingUtilities.InvokeLater(new Runnable() {
    public void run() {

        // code to update the GUI goes here
    }
});

不是对您问题的回答,但不是:
exploations.get(exploations.indexOf(e))
相当于……
e
?为了更快地获得更好的帮助,请发布一个.Not回答您的问题,而是“Swing程序应该覆盖
paintComponent()
,而不是覆盖
paint()
”-。也可以看到这一点。但是更新GUI的代码是什么,一个对repaint()的简单调用?@guillaume yout painting是从Runnable#Thread调用的,然后repaint()将被包装到invokeLater中,没有人知道另一个方法上隐藏了什么,即使我有
while(cursor<((rows*cols)-1)){timer.start(),试试看{SwingUtilities.invokeAndWait(new Runnable(){public void run(){board.repaint();}}}})}catch(异常e){}
它不工作,