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

Java Swing 如何获取Grid网格中鼠标点击对应的行列坐标位置

解决思路

你遇到的问题原因很简单:e.getX()返回的是鼠标点击位置相对于当前单元格左上角的相对坐标,点击同一单元格的不同位置数值自然会变化;e.getLocationOnScreen()是全局屏幕坐标,需要额外做偏移换算才能得到行列值,没必要这么麻烦。这里给你两种可行方案:

方案1:直接给单元格存储固定行列(推荐,性能最高无额外换算)

  1. 改造CellPane类,新增成员变量存储当前单元格的行列值,修改构造方法接收行列参数:
public class CellPane extends JPanel {
    private Color defaultBackground;
    // 新增成员变量存储行列
    private final int row;
    private final int col;

    // 改造构造方法传入行列
    public CellPane(int row, int col) {
        this.row = row;
        this.col = col;
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                defaultBackground = getBackground();
                setBackground(Color.RED);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                setBackground(defaultBackground);
            }
            @Override
            public void mouseClicked(MouseEvent e){
                // 直接读取存储的行列值即可
                System.out.printf("点击网格:行=%d,列=%d%n", row, col);
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(30, 30);
    }
}
  1. 在TestPane循环创建单元格的位置,把当前遍历的行列参数传入:
// 把原来的CellPane cellPane = new CellPane(); 改成下面这行
CellPane cellPane = new CellPane(row, col);

方案2:通过布局约束动态获取行列(无需修改CellPane构造结构)

如果不想修改CellPane的定义,也可以在点击时从父容器的GridBagLayout中读取当前单元格的布局约束,直接获取预设的gridx、gridy值:

@Override
public void mouseClicked(MouseEvent e){
    TestPane parentPane = (TestPane) getParent();
    GridBagLayout layout = (GridBagLayout) parentPane.getLayout();
    GridBagConstraints gbc = layout.getConstraints(CellPane.this);
    int row = gbc.gridy;
    int col = gbc.gridx;
    System.out.printf("点击网格:行=%d,列=%d%n", row, col);
}

两种方案都可以稳定拿到固定的网格行列坐标,不会出现同一单元格数值变动的问题。


内容的提问来源于stack exchange,提问作者Sebastián Bermúdez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:06:02