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

Swing游戏开发问题:Panel未绘制Square对象,求原因分析

问题分析与解决方案

从你给出的代码片段来看,Square对象没有绘制到JPanel上,大概率是以下几个关键环节出了问题,我来帮你逐一排查并修复:

1. JPanel未添加到JFrame中

你的代码里创建了panel对象,但没有把它添加到f(JFrame)的内容面板里——如果面板没被加入窗口,它根本不会显示,里面的Square自然也看不到。
修复代码:

public Test() {
    f.setSize(300,300);
    // 把panel添加到JFrame的内容面板
    f.add(panel);
    f.addMouseListener(new Mouseklick());
    panel.setBackground(Color.YELLOW);
    // 必须设置JFrame可见,否则窗口不会显示
    f.setVisible(true);
    // 建议加上关闭窗口的退出逻辑
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

2. 未重写JPanel的paintComponent方法实现绘制

Swing组件的自定义绘制逻辑必须写在paintComponent方法里,你需要重写这个方法,遍历list集合把每个Square画出来。
假设你的Square类包含坐标、尺寸和颜色属性,示例代码如下:

// 替换原有的JPanel初始化代码
JPanel panel = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // 必须先调用父类方法,保证面板背景等基础绘制正常
        // 遍历集合绘制每个Square
        for (Square square : list) {
            g.setColor(square.getColor());
            g.fillRect(square.getX(), square.getY(), square.getWidth(), square.getHeight());
            // 如果你的Square类自带draw方法,直接调用square.draw(g)即可
        }
    }
};

3. 添加Square后未触发面板重绘

当你把Square对象添加到list后,必须调用panel.repaint()通知Swing重新绘制面板,否则新添加的Square不会显示。
比如初始化添加Square的代码:

// 假设Square的构造参数是x、y、宽度、高度、颜色
list.add(new Square(50,50,50,50,Color.RED));
list.add(new Square(100,100,50,50,Color.BLUE));
list.add(new Square(150,150,50,50,Color.GREEN));
panel.repaint(); // 关键步骤:通知面板重绘

4. 鼠标监听器的绑定位置不合理

你把鼠标监听器绑定到了JFrame上,但JFrame的标题栏、边框会占用区域,导致点击坐标和面板内的实际坐标不匹配。建议把监听器绑定到panel上:

// 替换原有的监听器绑定代码
panel.addMouseListener(new Mouseklick());

然后在监听器的点击方法里,使用面板相对坐标判断点击位置:

class Mouseklick extends MouseAdapter {
    @Override
    public void mouseClicked(MouseEvent e) {
        int clickX = e.getX();
        int clickY = e.getY();
        // 使用迭代器遍历集合,安全移除元素
        Iterator<Square> iterator = list.iterator();
        while (iterator.hasNext()) {
            Square s = iterator.next();
            // 判断点击位置是否在Square范围内
            if (clickX >= s.getX() && clickX <= s.getX() + s.getWidth() 
                && clickY >= s.getY() && clickY <= s.getY() + s.getHeight()) {
                iterator.remove();
                panel.repaint(); // 移除后立即重绘面板
                break; // 若只需移除第一个被点击的Square,可加此语句
            }
        }
    }
}

把以上几点全部检查修复后,你的Square应该就能正常显示,并且点击后可以被移除了。

内容的提问来源于stack exchange,提问作者user9240647

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:04:59