Java:使用HashMaps从ArrayList迭代JMenuItem

时间:2012-05-14 09:34:04

标签: java swing hashmap jframe actionlistener

我有一个带有菜单栏的JFrame,其中我想要一些动态菜单,例如,取决于带有HashLists的ArrayList的大小。这里的问题是我得到了一个动态数量的JMenuItems,所以我需要一种方法来获得与HashLists一样多的变量。在这种情况下,我将变量的名称设为static,但显然不会对ActionListener起作用,因为所有的MenuItem都将具有相同的ActionListener。

我想知道如何解决这个问题,以及如何获得具有动态数量的菜单项的菜单,这些菜单项都有独特的动作助手。

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);
    }

提前致谢。

2 个答案:

答案 0 :(得分:1)

根据您在ActionListener中的操作,您可以使用this,就像现在一样,在actionPerformed中,您可以使用((JMenutItem)event.getSource())查看已单击的菜单项。或者,您可以注册与菜单一样多的ActionListener,如下所示:

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”,“answer”,“grade”,你可以创建以下类:

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

     // And getters and setters here.
}

并使用List<MyClass>代替List<HashMap>

答案 1 :(得分:0)

我不明白你为什么要为你的字符串使用HashMap。如果您保存字符串的ArrayList,并循环它们以将它们全部添加到菜单中,您可以将actionListeners添加到所有这些,就像您现在所做的那样。

在ActionListener中,通过循环遍历ArrayList并与所单击按钮的名称进行比较来检查单击了哪个按钮。