我有一个带有菜单栏的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);
}
提前致谢。
答案 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并与所单击按钮的名称进行比较来检查单击了哪个按钮。