JPopupMenu знает, какой JMenuItem нажат

мой вопрос очень простой. У меня есть JPopupMenu, на котором показаны два JMenuItem. Единственный способ, которым я нашел, чтобы узнать, какой элемент нажат с помощью

class MenuActionListener implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    System.out.println("Selected: " + e.getActionCommand());    
  }
}

но команда e.getActionCommand() напечатать текст внутри элемента. Я хотел бы получить индекс from 0 to n, чтобы знать, какой элемент нажат, а не текст (который можно изменить). Является ли это возможным ?


person Fry    schedule 26.03.2014    source источник
comment
Потому что мне нужно получить int, а не строку... в моем случае с int было бы проще. Но если это невозможно, я уже нашел обходной путь.   -  person Fry    schedule 26.03.2014
comment
извините за попытку помочь   -  person MadProgrammer    schedule 26.03.2014
comment
Проблема, я могу придумать несколько, но ни одна из них не может быть полезной и может быть просто пустой тратой времени друг друга...   -  person MadProgrammer    schedule 26.03.2014


Ответы (3)


Вы могли...

Поместите каждый 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);

Вы могли...

Используйте API Action.

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 из 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);

Но это становится грязным...

public void actionPerformed(ActionEvent e) {
    JMenuItem item = (JMenuItem)e.getSource();
    Object value = item.getClientProperty("keyValue");
    if (value instanceof Integer) {
        int index = ((Integer)value).intValue();

Вероятно, есть и другие решения, но, не зная, почему вы хотите это сделать, невозможно сделать точное предложение... извините

person MadProgrammer    schedule 26.03.2014

В приведенном ниже коде показано, как получить индекс выбранного 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);
            }
      }
person Community    schedule 26.03.2014
comment
Проблема с этим подходом в том, что он не принимает во внимание такие вещи, как JSeparators или другие компоненты, которые могут быть во всплывающем окне. - person MadProgrammer; 26.03.2014
comment
@MadProgrammer, вы правы, добавление instanceof JMenuItem должно исправить это, не так ли? - person ; 26.03.2014
comment
Проблема в том, что не зная, почему OP хочет получить значение int, получение индекса компонента может не привести к тому, что им нужно... - person MadProgrammer; 26.03.2014
comment
@MadProgrammer Кажется, он не хочет этим делиться. - person ; 26.03.2014

Почему мы не можем сделать:

menu.getSelectionModel().getSelectedIndex()

который возвращает int?

person WesternGun    schedule 26.08.2016