2012-05-14 100 views
0

我有一個帶有菜單欄的JFrame,其中我想要一些動態菜單,如根據ArrayList和HashLists的大小。這裏的問題是,我得到了一個動態的JMenuItems數量,所以我需要一種方法來獲取和HashLists一樣多的變量。在這種情況下,我創建了變量static的名稱,但顯然這不適用於ActionListener,因爲所有的MenuItem都具有相同的ActionListener。Java:使用HashMaps從ArrayList中迭代JMenuItem

我想知道如何解決這個問題,以及如何獲得一個菜單與動態數量的menuitems,所有菜單都有獨特的actionlisteners。

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

「並且有List而不是List。」 ? –

+0

@TimLagerburg對不起,我忘了放置防止打字的背影。 –

+0

沒問題。認爲是(解決方案的一部分)。 –

0

我不明白你爲什麼要爲你的字符串使用HashMap。如果您保存了一個字符串的ArrayList,然後遍歷它們將它們全部添加到菜單中,您可以將actionListeners添加到它們的全部,就像現在這樣。

在您的ActionListener中,通過循環ArrayList來檢查哪個按鈕被單擊,並與單擊按鈕的名稱進行比較。

+0

這是因爲該字符串旁邊的散列表中有更多數據。這是我在比較actionlistener與列表 –

+0

時想要調用的數據好吧,那麼不要介意那部分。不過,您可以通過將ActionListener與ArrayList中的HashMaps中的字符串進行比較來檢查哪個按鈕被單擊。 – Hidde

+0

我現在找到了我的路。 Thans爲您提供幫助。 –