java - 行上的 JTable 鼠标监听器示例

标签 java swing

我从另一个问题中获取了这段代码,并希望有人能够澄清几点:

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/

相关文章:

java - 为什么 JTable 总是触发 ListSelectionListener 两次?

java - 当您滚动超过某个点时, Swing 滚动 Pane 会发出通知

java - Stringify 对象无法以 JSON 形式存储在 mysql 中

java - 将 Java 字符串与 `compareTo()` 方法进行比较

java - 在 EDT 中使用 OSGi EventAdmin 是否安全?

java - 我在 GridLayout 中获取按钮的 X 和 Y 索引的方法

java - 如何嵌套复杂的Swing组件

java - 用java的图形类画直线

Java-EE-6 : How to store a boolean in a @ManyToMany and @ManyToOne relationships?

java - java swing 中的 MusicXML 文件 - 可视化表示和动态编辑