JTable上的JPopupMenu – >获取创建菜单的单元格

我有一种情况,当右键单击JTable时,我创建了一个弹出菜单。 创建弹出菜单的标准方法:

aJTable.setComponentPopupMenu(rightClickMenu); 

之后在注册的操作中,我无法找到右键单击哪个单元格以显示该弹出菜单。

 rightClickMenuItem.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { // Work out what cell was right clicked to generate the menu } }); 

关于你如何做到这一点的任何想法?

令人惊讶的事实是:安装了componentPopupMenu后,mouseListener永远不会看到作为popupTrigger的mouseEvent(原因是显示componentPopup由BasicLookAndFeel安装的AWTEventListener全局处理,并且该侦听器使用该事件)。

看到该触发器的mousePosition的唯一地方是getPopupLocation(MouseEvent),因此获取它的唯一可靠方法(用于执行依赖于位置的配置/操作)是@Mad的建议,即覆盖该方法并将值存储在某处以后用。

下面的代码段使用clientProperty作为存储位置:

 final JTable table = new JTable(new AncientSwingTeam()) { @Override public Point getPopupLocation(MouseEvent event) { setPopupTriggerLocation(event); return super.getPopupLocation(event); } protected void setPopupTriggerLocation(MouseEvent event) { putClientProperty("popupTriggerLocation", event != null ? event.getPoint() : null); } }; JPopupMenu popup = new JPopupMenu(); Action action = new AbstractAction("show trigger location") { @Override public void actionPerformed(ActionEvent e) { JPopupMenu parent = (JPopupMenu) SwingUtilities.getAncestorOfClass( JPopupMenu.class, (Component) e.getSource()); JTable invoker = (JTable) parent.getInvoker(); Point p = (Point) invoker.getClientProperty("popupTriggerLocation"); String output = p != null ? "row/col: " + invoker.rowAtPoint(p) + "/" + invoker.columnAtPoint(p) : null; System.out.println(output); } }; popup.add(action); popup.add("dummy2"); table.setComponentPopupMenu(popup); 

@MadProgrammer对getPopupLocation的建议看起来很有希望,但我无法弄清楚如何在表和actionEvent之间获取信息……

我通过确保在右键单击时选择了行来解决这个问题 – >由于弹出菜单阻止了行的选择,您可以添加一个鼠标监听器,确保无论点击什么行都会被选中(左侧)被按下了。

 aTable.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { int r = aTable.rowAtPoint(e.getPoint()); if (r >= 0 && r < clt.getRowCount()) { aTable.setRowSelectionInterval(r, r); } else { aTable.clearSelection(); } } }); 

这意味着在rightClickMenuItem的动作侦听器中,您可以获取表的选定单元格/行

 rightClickMenuItem.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { aTable.get details about the selected one.... } }); 

太容易了! 谢谢大家的帮助。

JTable有方法

 int row = rowAtPoint(p); int col = columnAtPoint(p); 

因此,传递MouseEvent的点并使用值

添加MouseListener并将最后一个右键单击点存储在某处。