JPopupMenu知道点击了哪个JMenuItem

时间:2014-03-26 09:40:57

标签: java swing jmenuitem jpopupmenu

我的问题非常简单。我有一个显示两个JPopupMenu的{​​{1}}。我发现知道使用

点击哪个项目的唯一方法
JMenuItem

但命令class MenuActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Selected: " + e.getActionCommand()); } } 打印项目内的文本。我想获得一个索引e.getActionCommand()来知道哪个项被点击而不是文本(可以修改)。 有可能吗?

3 个答案:

答案 0 :(得分:8)

你可以......

将每个JMenuItem放入Map,并带有您想要的int

Map<JMenuItem, Integer> menuMap = new HashMap<JMenuItem, Integer>(25);
//...
JMenuItem item1 = ...
menuMap.put(item, 0);
JMenuItem item2 = ...
menuMap.put(item, 1);

然后在ActionListener中,您只需根据事件来源查找...

public void actionPerformed(ActionEvent e) {
    JMenuItem item = (JMenuItem)e.getSource();
    int index = menuMap.get(item);

你可以......

使用List并确定列表中JMenuItem的索引...

List<JMenuItem> menuList = new ArrayList<JMenuItem>(25);
//...
JMenuItem item1 = ...
menuList.add(item);
JMenuItem item2 = ...
menuList.add(item);

//...

public void actionPerformed(ActionEvent e) {
    JMenuItem item = (JMenuItem)e.getSource();
    int index = menuList.indexOf(item);

你可以......

使用Action API

public class IndexedAction extends AbstractAction {
    private int index;
    public IndexedAction(int index, String name) {
        this.index = index;
        putValue(NAME, name);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // Use the index some how...
    }
}

//...

JPopupMenu menu = new JPopupMenu();
menu.add(new IndexedAction(0, "Item 1"));
menu.add(new IndexedAction(1, "Item 2"));
menu.addSeparator();
menu.add(new IndexedAction(2, "Item 3"));
menu.add(new IndexedAction(3, "Item 4"));

你可以......

设置项目的actionCommand属性...

JPopupMenu pm = ...;
pm.add("Item 1").setActionCommand("0");
pm.add("Item 2").setActionCommand("1");
menu.addSeparator();
pm.add("Item 3").setActionCommand("2");
pm.add("Item 4").setActionCommand("3");

问题在于您是否必须将actionCommand的{​​{1}}解析回ActionEvent ...而不是真正完善的解决方案..

你可以......

设置每个int

clientProperty
JMenuItem

但这会变得混乱......

JPopupMenu pm = ...;
pm.add("Item 1").putClientProperty("keyValue", 0);
pm.add("Item 2").putClientProperty("keyValue", 1);
menu.addSeparator();
pm.add("Item 3").putClientProperty("keyValue", 2);
pm.add("Item 4").putClientProperty("keyValue", 3);

可能有其他解决方案,但不知道你为什么要这样做,这使得无法提出准确的建议......对不起

答案 1 :(得分:2)

以下代码显示了如何获取所选JMenuItem的索引:

      class MenuActionListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                JMenuItem menuitem=(JMenuItem) e.getSource();
                JPopupMenu popupMenu =(JPopupMenu) menuitem.getParent();
                int index= popupMenu.getComponentIndex(menuitem);
                System.out.println("index:"+index);
            }
      }

答案 2 :(得分:0)

为什么我们不能这样做:

menu.getSelectionModel().getSelectedIndex()

返回int