我有一个带有菜单栏的 JFrame,其中我想要一些动态菜单,如图所示,具体取决于带有 HashList 的 ArrayList 的大小。这里的问题是我得到了动态数量的 JMenuItems,所以我需要一种方法来获取与 HashLists 一样多的变量。在本例中,我将变量的名称设为静态,但显然这不适用于 ActionListener,因为所有 MenuItem 都将具有相同的 ActionListener。
我想知道如何解决这个问题,以及如何获得一个具有动态数量的菜单项的菜单,这些菜单项都有独特的 Action 监听器。
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);
}
提前致谢。
最佳答案
根据您想要在 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>
.
关于Java:使用 HashMap 从 ArrayList 迭代 JMenuItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10580734/