首页 > 解决方案 > 使用事件监听器添加到数组列表 [Java]

问题描述

我有一个带有三角形的游戏循环,它在屏幕上随机移动。我想添加一个按钮,单击该按钮将添加另一个随机移动的三角形。我正在使用事件侦听器,无论我将它放在哪里,我仍然会遇到异常

这是我的代码

import javax.swing.*;
import drawing.Canvas;
import tools.Utils;
import triangle.DynamicTriangle;

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

public class TriangleProgram {
    private JFrame frame; 
    private Canvas canvas; 
    private JPanel lowerPanel; 
    private JButton addTriangleButton; 
    private ArrayList<DynamicTriangle> triangles;

    public void gameLoop() {
        int deltaTime = 20;

        triangles.add(new RandomTriangleA(canvas, 150, 150));

        for (DynamicTriangle dynamicTriangle : triangles) {
            dynamicTriangle.drawTriangle();
        }
        while (true)
        {
            for (DynamicTriangle dynamicTriangle : triangles) {
                dynamicTriangle.undrawTriangle();
            }

            for (DynamicTriangle dynamicTriangle : triangles) {
                dynamicTriangle.update(100);
                dynamicTriangle.wrapPosition();
            }

            for (DynamicTriangle dynamicTriangle : triangles) {
                dynamicTriangle.drawTriangle();
            }

            Utils.pause(deltaTime);
            canvas.repaint();
        }

    }

    public TriangleProgram() {
        frame = new JFrame();
        frame.setTitle("Canvas");
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        canvas = new Canvas();
        frame.add(canvas, BorderLayout.CENTER);

        lowerPanel = new JPanel();
        lowerPanel.setLayout(new FlowLayout());
        frame.add(lowerPanel, BorderLayout.SOUTH);

        triangles = new ArrayList<DynamicTriangle>();

        addTriangleButton = new JButton("Add Triangle"); 
        lowerPanel.add(addTriangleButton);
        frame.revalidate();

        addTriangleButton.addActionListener(new ButtonListener());

        gameLoop();

    }

    public static void main(String[] args) {
        System.out.println("Running TriangleProgram...");
        new TriangleProgram();
    }

    class ButtonListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent ae) {
            System.out.println(triangles.size());
            triangles.add(new RandomTriangleA(canvas, 150, 150));
        }

    }

}

我希望每次按下按钮时都会将一个新三角形添加到画布中,但我得到的是堆栈跟踪:

Running TriangleProgram...
1
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index -1 out-of-bounds for length 0
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:372)
    at java.base/java.util.ArrayList.remove(ArrayList.java:517)
    at java.base/java.util.Collections$SynchronizedList.remove(Collections.java:2424)
    at drawing.Canvas.removeMostRecentLine(Canvas.java:162)
    at triangle.Triangle.undrawTriangle(Triangle.java:131)
    at TriangleProgram.gameLoop(TriangleProgram.java:29)
    at TriangleProgram.<init>(TriangleProgram.java:69)
    at TriangleProgram.main(TriangleProgram.java:75)

标签: javaarraylistevent-listener

解决方案


        triangle.add(new Triangle(canvas, 150, 150));

好吧,你甚至从来没有声明过triangle,所以不确定这段代码是如何运行给你一个异常的。我假设你的意思是triangles 你也可以(?)压缩你的循环。

编辑:另外,当您声明三角形列表时,为什么它是一个列表,DynamicTriangle但是当您初始化并添加到列表时它是Triangle.

不确定DynamicTriangle是子类Triangle还是拼写错误,但如果是这种情况,它不应该编译。

如果是错字,请ArrayList<DynamicTriangle> triangles改用Triangle

如果DyanmicTriangle是的子类,Triangle那么您希望ArrayList<Triangle>()在添加时声明和初始化三角形.add(new DynamicTriangle(...


推荐阅读