我有一个JTable和一个特定于每一行的弹出菜单。我想计算用户右键单击鼠标的行(Windows L& F)以显示弹出菜单。
我为表创建一个MouseListener,因此它在单击时获取MouseEvent,并在正确的位置显示弹出菜单。但是当用户从弹出菜单中选择一个项目时,我无法确定一种方法来确定用户在第一个位置右键单击的行。弹出菜单调用的事件没有右键单击发生的x,y坐标。
我已经看过获取弹出窗口的位置,但这属于框架,而不是表格,所以它和它的父母都没有正确的x,y值。我们想要的。
我通过继承JPopupMenu并设置我希望它在MouseListener中拥有的x和y值来解决它。但在我看来,对于想要在JTable上放置弹出菜单的人来说,这将是一个普遍的问题,我想知道我错过了什么。
是否有更简单的方法可以做到这一点,尤其是那些不涉及子类化JPopupMenu的方法?
答案 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()来处理你的行。或者您可以将它们保存在一个单独的数据结构中,您可以从弹出菜单监听器中访问它。