0

我有一个带有菜单栏的 JFrame,我想要一些动态菜单,例如,这取决于带有 HashLists 的 ArrayList 的大小。这里的问题是我得到了动态数量的 JMenuItems,所以我需要一种方法来获取与 HashLists 一样多的变量。在这种情况下,我将变量的名称设为静态,但显然这不适用于 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);
    }

提前致谢。

4

2 回答 2

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>.

于 2012-05-14T10:11:31.100 回答
0

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

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

于 2012-05-14T09:46:01.990 回答