如何获取调用JPopupMenu的组件?

8

我有一个JPopUpMenu,它被添加到多个JTable中,我想获取右键单击的特定表格,以便我可以对其进行更改。如何在Action Listener中获取触发JPopupMenu的组件?

JPopupMenu popupMenu = new JPopupMenu();
JMenuItem menuItemRename = new JMenuItem("Rename");
popupMenu.add(menuItemRename);
table.getTableHeader().setComponentPopupMenu(popupMenu);

ActionListener menuListener = new ActionListener() {
    public void actionPerformed(ActionEvent event) {
           String newTitle = JOptionPane.showInputDialog(null, "Enter new title");
                   //Get the table and rename it here 
                }
            };
menuItemRename.addActionListener(menuListener);

1
+1 使用componentPopupMenu。现在使用Action而不是ActionListener,它将会更完美 :-) - kleopatra
@kleopatra 你是什么意思?我该如何使用 Action? - Igor
最快学习的方法是阅读Swing标签维基中引用的教程章节,了解如何使用Actions/Menus :-) - kleopatra
3个回答

10

使用 getInvoker() 方法。

Component invoker = popupMenu.getInvoker();

提示:你需要先将 ActionEvent 源转换为 JPopupMenu 引用类型。 ;) - MadProgrammer
有一个问题...头部保持选中状态,直到再次点击它。有什么想法吗? - Igor
1
虽然这个答案是正确的,而且回答了问题,但它需要你将一个JPopupMenu引用传递给你的Action。作为替代方案,你可以同样将你的源引用传递给Action,这个问题就会消失。在许多情况下,这可能是更简单的解决方案。 - lbalazscs

1

FWIW,

// ActionEvent e
((JPopupMenu)((JMenuItem)e.getSource()).getParent()).getInvoker()

天啊...


5
这是对一个十年前问题的代码回答,已经有六个现有答案。当回答旧问题时,重要的是要解释你的答案涉及到该问题的哪个新方面,并注意时间的流逝是否改变了可能的答案。仅使用代码的答案通常可以通过添加一些关于如何和为什么的说明来改进。 - Andreas
这个答案解决了原始问题:给定一个ActionEvent,获取菜单的调用者。其他答案没有解释如何做到这一点,尽管它们包含有用的提示。但这只是提示,而不是解决方案。因此,我取消了删除此答案的操作。至于10年,那是一个八进制的10,涉及的类仍然存在于Java 13中,甚至没有被弃用。 - 18446744073709551615
@18446744073709551615 我用了你的提示,谢谢,八进制 10 年后 :) - Furkan
太完美了!我一直在苦苦思索如何找到这个点,以及哪个组件可能映射到该点,但这是一个一行代码,可以从ActionEvent中获取所需的信息。谢谢! - Jeremy Brooks

0
使用event.getSource()方法;

它返回一个JMenuItem,对于两个可能的来源都是相同的;其getParent()方法返回一个JPopupMenu,也是相同的,而其父级为null。虽然有可能拥有两个或更多相同的菜单,但是... - 18446744073709551615

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