Java Swing 如何获取Grid网格中鼠标点击对应的行列坐标位置
解决思路
你遇到的问题原因很简单:e.getX()返回的是鼠标点击位置相对于当前单元格左上角的相对坐标,点击同一单元格的不同位置数值自然会变化;e.getLocationOnScreen()是全局屏幕坐标,需要额外做偏移换算才能得到行列值,没必要这么麻烦。这里给你两种可行方案:
方案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); } }
- 在
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
相关产品推荐
相关产品推荐

