我从另一个问题中提取了这段代码,希望有人可以澄清几点:

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对于不同的平台可能会有所不同。

10-07 15:58