按键盘Menu键触发JPopupMenu时JTable选中行偏移跳转如何解决
问题解答
问题诱因
你当前的实现逻辑是通过JPopupMenu左上角坐标换算对应表格行,仅适配鼠标右键触发场景:右键唤起菜单时,菜单锚定在鼠标点击位置,坐标换算后可以匹配到点击的行。
而用键盘Menu键唤起菜单时,Swing默认将弹出菜单定位在当前焦点单元格的侧方/下方,并不和单元格坐标对齐,此时用菜单左上角坐标换算得到的行号自然会出现偏移,若表格存在滚动条、自定义行高,偏移会更明显。
修复方案
不要将选中行的逻辑绑定在PopupMenu的显示事件上,改为分场景处理即可:
- 鼠标右键场景:给表格添加鼠标监听器,右键点击时先选中对应行,再触发弹出菜单
- 键盘唤起场景:直接使用表格当前已选中的行,不需要额外计算
代码修改示例
首先移除你原来写的popupMenu.addPopupMenuListener整块代码,以及table.setComponentPopupMenu(popupMenu);配置,新增如下表格鼠标监听器即可:
table.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (e.isPopupTrigger()) { // 点击时选中对应行 Point point = e.getPoint(); int currentRow = table.rowAtPoint(point); int currentColumn = table.columnAtPoint(point); table.changeSelection(currentRow, currentColumn, false, false); // 弹出菜单 popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } @Override public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { Point point = e.getPoint(); int currentRow = table.rowAtPoint(point); int currentColumn = table.columnAtPoint(point); table.changeSelection(currentRow, currentColumn, false, false); popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } });
修改后鼠标右键点击时会先选中行再弹出菜单,键盘Menu键唤起时会自动使用当前表格的选中行,不会再出现偏移问题。
内容的提问来源于stack exchange,提问作者Bu Saeed
相关产品推荐
相关产品推荐

