找到已调用弹出菜单的JTable行

我有一个JTable和一个特定于每一行的弹出菜单。 我想计算用户右键单击鼠标(Windows L&F)以显示弹出菜单的行。

我为表创建一个MouseListener,因此它在单击时获取MouseEvent,并在正确的位置显示弹出菜单。 但是当用户从弹出菜单中选择一个项目时,我无法确定一种方法来确定用户在第一个位置右键单击的行。 弹出菜单调用的事件不再具有右键单击发生的x,y坐标。

我已经看过获取弹出窗口的位置,但这属于框架,而不是表格,所以它和它的父母都没有正确的x,y值。

我通过inheritanceJPopupMenu并设置我想要它在MouseListener中的x和y值来解决它。 但在我看来,对于想要在JTable上放置弹出菜单的人来说,这将是一个普遍的问题,我想知道我错过了什么。

有没有更简单的方法来做到这一点,尤其是不涉及子类化JPopupMenu的方法?

JTable.rowAtPoint(...); 

你可以从MouseEvent获得这一点。

编辑:

 table.addMouseListener( new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { JTable source = (JTable)e.getSource(); int row = source.rowAtPoint( e.getPoint() ); int column = source.columnAtPoint( e.getPoint() ); if (! source.isRowSelected(row)) source.changeSelection(row, column, false, false); popup.show(e.getComponent(), e.getX(), e.getY()); } } }); 

如果您不介意在右键单击上选择行,则在MouseListener中使用JTable.rowAtPoint()并选择该行(如果未选中),然后在弹出监听器中使用JTable.getSelectedRows()来处理您的行。 或者,您可以将它们保存在可以从弹出菜单侦听器访问的单独数据结构中。