在整个JTable组件上右键单击MouseListener

5
我正在使用Netbeans,我设计了一个包含JTable的窗口,并在JTable组件上添加了MouseEvent侦听器,并添加了以下代码:
private void productsTableMousePressed(java.awt.event.MouseEvent evt) {
    if(evt.isPopupTrigger()) {
        tablePopupMenu.setLocation(evt.getXOnScreen(), evt.getYOnScreen());
        tablePopupMenu.setVisible(true);
        System.out.println("Fired!");
    }
}

private void productsTableMouseReleased(java.awt.event.MouseEvent evt) {
    if(evt.isPopupTrigger()) {
        tablePopupMenu.setLocation(evt.getXOnScreen(), evt.getYOnScreen());
        tablePopupMenu.setVisible(true);
    }
}

但它仅在我点击某些单元格时才起作用。我想让它在整个 JTable 区域内工作。如何做到?

3个回答

3

但它只在我点击某些单元格时才起作用,但我希望它能在整个JTable区域内工作。

MouseListener将在所有单元格上工作。我不知道您是否应该使用setLocation(...)方法。

请参见 弹出菜单以获取示例代码。

或者更好的方法是使用:

table.setComponentPopupMenu(...);

1
+1 用于 componentPopupMenu - 这是做这件事的最佳方式 :-) 教程已过时 ... - kleopatra

3
假设您的表格位于JScrollPane中,它可能无法覆盖整个视口。为确保整个视口区域被覆盖,请在表格上调用 setFillsViewportHeight(true)

是的,你说得对,那就是我的问题 :) 几分钟前我解决了它。但是,谢谢你的方法,因为我通过在JScrollPane上触发mousePressed解决了它,不过你的解决方案听起来更好。 - Mikołaj Stolarski
很少有人似乎知道如何正确地与JScrollPane进行交互。我自己仍然比我想象中的更加困难。 - jackrabbit

0

我发现在我的JTable中(它位于JScrollPane中,嵌套在JInternalFrame中),当JTable比JScrollPane大时,滚动和调整大小可能会出现问题。

基本上,如果该框架在我的左侧监视器上,但我已经将表格滚动到最右侧,则弹出窗口将出现在我的右侧监视器上。

我审查了四个不同选项的结果:对于框架和滚动窗格的getMousePositions(),加上鼠标事件getX和getXOnScreen()。

唯一给我想要的结果的是框架的getMousePositions()。其他所有内容都被其自身的世界内部视图所偏移,这对我来说是有意义的。

所以我想说的是,小心你获取鼠标坐标的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接