java - 使用事件监听器添加到数组列表 [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)
解决方案
triangle.add(new Triangle(canvas, 150, 150));
好吧,你甚至从来没有声明过triangle
,所以不确定这段代码是如何运行给你一个异常的。我假设你的意思是triangles
你也可以(?)压缩你的循环。
编辑:另外,当您声明三角形列表时,为什么它是一个列表,DynamicTriangle
但是当您初始化并添加到列表时它是Triangle
.
不确定DynamicTriangle
是子类Triangle
还是拼写错误,但如果是这种情况,它不应该编译。
如果是错字,请ArrayList<DynamicTriangle> triangles
改用Triangle
。
如果DyanmicTriangle
是的子类,Triangle
那么您希望ArrayList<Triangle>()
在添加时声明和初始化三角形.add(new DynamicTriangle(...
推荐阅读
- json - jsonschema2pojo 生成对象类型的所有变量,但不是我提供的数据类型
- elasticsearch - 为什么 searchResult.TotalHits() 与 len(searchResult.Hits.Hits) 不同?
- java - 从不同的片段访问列表
- pandas - 如何在熊猫列上计算非空值然后聚合
- c# - TFS (AzureDevOps) 2015 C# 获取构建中使用的变量
- node.js - 将 S3 存储桶的内容复制到另一个存储桶 | 节点JS
- angular - 如何在点击时打开弹出窗口?
- c# - 我想在数据表中添加新行而不对现有数据产生任何影响
- string - 如果列表中包含特定单词,如何从列表中删除字符串
- c++11 - 用于 constexpr 深度和 IEEE 754 指数计算的 NVIDIA nvcc 编译标志