我从另一个问题中提取了这段代码,希望有人可以澄清几点:
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
int r = table.rowAtPoint(e.getPoint());
if (r >= 0 && r < table.getRowCount()) {
table.setRowSelectionInterval(r, r);
} else {
table.clearSelection();
}
int rowindex = table.getSelectedRow();
if (rowindex < 0)
return;
if (e.isPopupTrigger() && e.getComponent() instanceof JTable ) {
JPopupMenu popup = createYourPopUp();
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
});
我知道定义“ r”的行在鼠标事件点获取该行。但是为什么使用table.getSelectedRow()初始化“ rowindex”?为什么不只使用变量“ r”。他们不是同一回事吗?
也-我对e.isPopupTrigger()感到困惑。我阅读了文档,并将其表示为返回mouseevent是否是弹出窗口的触发器...。窍门显然是在名称中-但是我不确定是什么条件使它为真或为假(尤其是弹出窗口) .show()的第一个参数是调用方,位于if语句内)。
抱歉,我只是不想盲目地复制代码!
谢谢
最佳答案
但是为什么使用table.getSelectedRow()初始化“ rowindex”?为什么不只使用变量“ r”。
该代码正在检查鼠标指针是否在表的最后一行之后。使用以下命令时可能会发生这种情况:
table.setFillsViewportHeight(true);
并且您的表数据不会完全填充滚动窗格视口中的所有行。
因此,如果在最后一行之后单击,
rowAtPoint(...)
方法将返回-1,这将与getSelectedRow()
返回的行不同。这将导致行选择被删除。
现在,您可以使用getSelectedRow()方法确定是否有选定的行,并因此显示弹出窗口。
我被e.isPopupTrigger()弄糊涂了。
用于显示弹出窗口的MouseEvent对于不同的平台可能会有所不同。