You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:00:48