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

时间:2010-11-08 02:28:29

标签: java swing jtable jpopupmenu

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

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

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

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

是否有更简单的方法可以做到这一点,尤其是那些不涉及子类化JPopupMenu的方法?

2 个答案:

答案 0 :(得分: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());
        }
    }
});

答案 1 :(得分:2)

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