6

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

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

我已经查看了弹出窗口的位置,但它属于框架,而不是表格,所以它和它的父级都没有我想要的正确 x,y 值。

我通过子类化 JPopupMenu 并设置我希望它在 MouseListener 中具有的 x 和 y 值来解决它。但在我看来,这对于任何想要在 JTable 上放置弹出菜单的人来说都是一个普遍的问题,我想知道我错过了什么。

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

4

2 回答 2

14
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());
        }
    }
});
于 2010-11-08T02:35:35.927 回答
2

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

于 2010-11-08T07:51:25.690 回答