2012-05-14 2 views
0

У меня есть JFrame с меню, в котором мне бы хотелось, чтобы некоторые динамические меню, в зависимости от размера ArrayList с HashLists. Проблема здесь в том, что я получил динамическое количество JMenuItems, поэтому мне нужен способ получить столько переменных, сколько HashLists. В этом случае я сделал имя переменной static, но, очевидно, это не работает на ActionListener, так как все MenuItems будут иметь тот же ActionListener.Java: Iterate JMenuItem из ArrayList с HashMaps

Мне интересно, как это решить, и как получить меню с динамическим количеством элементов меню, которые имеют уникальные исполнители действий.

private ArrayList<HashMap> menuLijst; 

.

for (HashMap h : menuLijst) { 
     String vraag = (String) h.get("vraag"); 
     JMenuItem qMenu = new JMenuItem(vraag); 
     informatie.add(qMenu); 
     qMenu.addActionListener(this); 
    } 

Заранее спасибо.

+1

Что вы хотите сделать, если щелкнуть элемент меню? –

+0

Я хочу, чтобы произошло действие, например, показать таблицу или диаграмму в текущем кадре. –

ответ

1

В зависимости от того, что вы хотите сделать в своем ActionListener, вы можете использовать this, как и сейчас, и в actionPerformed вы можете использовать ((JMenutItem)event.getSource()), чтобы увидеть, какой пункт меню был нажат. В качестве альтернативы, вы можете зарегистрироваться как много ActionListeners как есть меню, как это:

for (final HashMap h : menuLijst) { 
    final String vraag = (String) h.get("vraag"); 
    final JMenuItem qMenu = new JMenuItem(vraag); 
    informatie.add(qMenu); 
    qMenu.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
       // here event.getSource() is the same as qMenu 
       System.out.println("Menu "+qMenu+" with label "+vraag+" has been pressed"); 
       System.out.println("HashMap is "+h); 
     } 
    }); 
} 

Но мне (а также видеть ваши предыдущие вопросы), кажется, что вы злоупотребляете использование HashMap вместо того, чтобы использовать соответствующие новый объекты. Я не знаю, что еще есть в вашем HashMap, скажем, что у вас есть 3 клавиши: «vraag», «ответ», «класс», вы можете создать следующий класс:

public class MyClass { 
    private String vraag; 
    private String answer; 
    private int grade; 

    // And getters and setters here. 
} 

И есть List<MyClass> вместо List<HashMap>.

+0

«И иметь список вместо списка». ? –

+0

@TimLagerburg Извините, я забыл поставить backtiks, которые помешали напечатать на экране. –

+0

Нет проблем. Думаю, это будет (частью) решение. –

0

Я не понимаю, почему вы хотите использовать HashMap для своих строк. Если вы сохраните ArrayList of Strings и зациклитесь на них, чтобы добавить их в меню, вы можете добавить для них все действия, как и сейчас.

В своем ActionListener проверьте, какая кнопка нажата, перейдя по массиву ArrayList и сравнивая с именем нажатой кнопки.

+0

Это потому, что в хеш-листе у этой строки больше данных. Это данные, которые я хотел вызвать при сравнении actionlistener со списком –

+0

Хорошо, не обращайте внимания на эту часть. Тем не менее, вы можете проверить ActionListener, на которую нажата кнопка, сравнив ее со строками в HashMaps в ArrayList. – Hidde

+0

Я нашел свой путь сейчас. Thans для вашей помощи. –

Смежные вопросы