我从另一个问题中获取了这段代码,并希望有人能够澄清几点:
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 语句内)。
抱歉造成困惑,我只是不想盲目复制代码!
谢谢
最佳答案
but why is 'rowindex' initialised using table.getSelectedRow()? why not just use the variable 'r'.
代码正在检查鼠标点是否位于表中最后一行之后。当您使用以下内容时可能会发生这种情况:
table.setFillsViewportHeight(true);
并且您的表格数据没有完全填充滚动 Pane 视口(viewport)中的所有行。
因此,如果您在最后一行之后单击,rowAtPoint(...)
方法将返回 -1,这与 getSelectedRow()
返回的行不同.
这将导致行选择被删除。
现在您可以使用 getSelectedRow() 方法来确定是否有选定的行,从而显示弹出窗口。
i'm confused by e.isPopupTrigger().
用于显示弹出窗口的 MouseEvent 对于不同的平台可能有所不同。
关于java - 行上的 JTable 鼠标监听器示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42912130/