2012-06-14 82 views
5

我有類似下面的代碼:傳遞變量的ActionListener在Java中

for(int i=0;i<10;i++){ 
     button=new JButton(buttons[i]); 
     button.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       setPage(i); 
      } 
     }); 
     menu.add(button); 
    } 

然而,可變i沒有在ActionListener的類的範圍界定。我怎樣才能傳遞變量?

+2

當偵聽器被觸發時,'i'總是'10'。 (是不是最終的要求很好?) –

回答

16

除了氣墊船的答案,你要注意,你不會被迫使用匿名類爲你的聽衆。氣墊船的答案的代碼是類似於以下之一:

private class PageActionListener implements ActionListener { 
    private int page; 

    public PageActionListener(int page) { 
     this.page = page; 
    } 

    public void actionPerformed(ActionEvent e) { 
     setPage(page); 
    } 
} 

... 

for(int i = 0; i < 10; i++){ 
    button = new JButton(buttons[i]); 
    button.addActionListener(new PageActionListener(i)); 
    menu.add(button); 
} 
+1

downvoter:謹慎解釋你的downvote? –

+0

可能不會更正+1 – mKorbel

+0

我喜歡這種方法,更多的是在循環中製作最終變量(當然是個人偏好)。 A +1改正downvote – Robin

11

變量i實際上在ActionListener的範圍內,但由於您試圖在內部類中使用局部變量,因此該變量必須是最終的。所以,你可以使用最後一個變量爲這樣的:

for(int i=0;i<10;i++){ 
    final int index = i; 
    button=new JButton(buttons[i]); 
    button.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      setPage(index); 
     } 
    }); 
    menu.add(button); 
} 
15

完全不同的方法將一個屬性添加到該按鈕,並檢索你的動作監聽該屬性。 例如

button=new JButton(buttons[i]); 
button.putClientProperty("page", i); 
button.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
     setPage((Integer)((JButton)e.getSource()).getClientProperty("page")); 
    } 
}); 
+0

+1偉大建議 – mKorbel

+0

這應該是被接受的答案。這是一個更簡單的方法。坦率地說,我不知道屬性可以添加到像這樣的按鈕。很好的答案。 –

+0

爲什麼這不是公認的答案? –