如何不使用ArrayList从数组中移除对象?Swing小应用开发求助
嘿,我来帮你搞定这个点击圆形后从数组移除的问题!
首先得说清楚:Java里的普通数组是固定长度的,没法直接删除元素,只能手动把后面的元素往前挪,还得维护有效元素的计数,挺麻烦的。所以最省心的办法是把固定数组换成ArrayList<Sprite>,它支持动态添加/删除元素,用起来方便多了。
具体步骤来啦:
1. 替换数组为ArrayList
把原来的数组定义:
Sprite[] sprites = new Sprite[10];
改成:
// 用ArrayList替代固定数组 List<Sprite> sprites = new ArrayList<>();
然后初始化的时候直接往列表里加10个Sprite就行:
// 初始化10个圆形(根据你的Sprite构造方法调整参数) for (int i = 0; i < 10; i++) { sprites.add(new Sprite(/* 这里传你的x、y、半径等参数 */)); }
2. 在GameCanvas里处理鼠标点击事件
你需要给GameCanvas(应该是JPanel的子类吧?)加个鼠标监听器,判断点击的位置是不是落在某个圆形范围内,找到后就从列表里移除它,然后重绘画布让圆形消失。
代码示例:
public class GameCanvas extends JPanel { private List<Sprite> sprites = new ArrayList<>(); public GameCanvas() { // 初始化sprites... // 添加鼠标点击监听器 addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { int clickX = e.getX(); int clickY = e.getY(); // 倒序遍历列表,避免删除元素后索引混乱 for (int i = sprites.size() - 1; i >= 0; i--) { Sprite currentSprite = sprites.get(i); // 计算点击点到圆心的距离 double distance = Math.sqrt( Math.pow(clickX - currentSprite.getX(), 2) + Math.pow(clickY - currentSprite.getY(), 2) ); // 如果距离小于等于半径,说明点击到了这个圆形 if (distance <= currentSprite.getRadius()) { sprites.remove(i); // 从列表移除 repaint(); // 重绘画布,让圆形消失 break; // 假设每次只点一个,找到就退出循环 } } } }); } // 你的paintComponent方法,遍历sprites绘制每个圆形 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (Sprite sprite : sprites) { g.setColor(sprite.getColor()); g.fillOval(sprite.getX() - sprite.getRadius(), sprite.getY() - sprite.getRadius(), sprite.getRadius() * 2, sprite.getRadius() * 2); } } }
3. 如果你非要用固定数组怎么办?
要是你不想换ArrayList,那就得手动处理元素移动和计数:
- 加一个
spriteCount变量记录当前有效的圆形数量 - 找到要删除的元素索引后,把后面的元素依次往前移一位,最后把最后一个有效位置设为null,再把
spriteCount减1
代码示例:
public class GameCanvas extends JPanel { private Sprite[] sprites = new Sprite[10]; private int spriteCount = 10; // 初始10个有效圆形 public GameCanvas() { // 初始化sprites数组... addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { int clickX = e.getX(); int clickY = e.getY(); int removeIndex = -1; // 找到被点击的圆形索引 for (int i = 0; i < spriteCount; i++) { Sprite sprite = sprites[i]; double distance = Math.sqrt( Math.pow(clickX - sprite.getX(), 2) + Math.pow(clickY - sprite.getY(), 2) ); if (distance <= sprite.getRadius()) { removeIndex = i; break; } } // 如果找到就删除 if (removeIndex != -1) { deleteCircle(removeIndex); } } }); } private void deleteCircle(int removeIndex) { // 把后面的元素往前移 for (int i = removeIndex; i < spriteCount - 1; i++) { sprites[i] = sprites[i + 1]; } sprites[spriteCount - 1] = null; // 清空最后一个有效位置 spriteCount--; repaint(); } // paintComponent方法里只遍历到spriteCount @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < spriteCount; i++) { Sprite sprite = sprites[i]; g.setColor(sprite.getColor()); g.fillOval(sprite.getX() - sprite.getRadius(), sprite.getY() - sprite.getRadius(), sprite.getRadius() * 2, sprite.getRadius() * 2); } } }
重点提醒:
不管用哪种方式,删除元素后一定要调用repaint(),这样画布才会重新绘制,消失的圆形才不会留在界面上哦!
内容的提问来源于stack exchange,提问作者IMBABOT
相关产品推荐
相关产品推荐

