2012-12-17 31 views
0

好的,所以我無法在其他地方找到我需要的東西,所以在這裏。將一個變量傳遞給一個ActionListener

我該如何去將一個變量傳遞給一個ActionListener()內的函數?這是我的代碼。

for(int y = 0; y < 5; y ++) { 
     for(int x = 0; x < 5; x ++) { 
      currentRect = (y * 5) + x; 
      mainButtons.get(currentRect).addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent event) { 
        answerField.setText(questions.get(currentRect).getAnswer()); 
       } 
      }); 
     } 
    } 

該錯誤是上線6,在那裏它強調「currentRect」,然後抱怨此,

無法指非最終變量currentRect在一個限定的內類的內部不同方法

什麼是不是通過一組Jbutton將(javax.swing中)的迭代,然後分配適當的動作偵聽器基於它們在該ArrayList位置,但是,我似乎無法將存儲其位置的變量傳遞給actionlistener本身,所以我卡住了。我意識到,即時通訊寫這個,我應該真的使用一個foreach,所以後來改變了。 (只是對誰指出的一點點說明)我意識到我不能最終做出這個變量,因爲它在for循環期間被改變了。我也嘗試將currentRect((y * 5)+ x)的值傳遞給函數,但無濟於事。

感謝,

andrewgies17

+0

你能從'event'對象中得到你需要的東西嗎? – gMale

+0

由於錯誤消息提示,您可以將'currentRect'聲明爲'final'來滿足編譯器。這是否是一個好設計完全是另一回事。 –

回答

2

解決方法很簡單,只需聲明一個新的最後一個變量的塊內:

for(int y = 0; y < 5; y ++) { 
     for(int x = 0; x < 5; x ++) { 
      final int currentRect = (y * 5) + x; 

,或者如果你需要的塊外currentRect的價值:

for(int y = 0; y < 5; y ++) { 
     for(int x = 0; x < 5; x ++) { 
      currentRect = (y * 5) + x; 
      final int currentRect2 = currentRect; 

,你在使用的,而不是currentRect currentRect2你的匿名課程。這是違反直覺的,因爲它看起來像變量每次都重新初始化,但事實上,您必須將此視爲一個新變量,該變量僅對該塊的每個循環初始化一次。

但是,這不是解決這個問題的最明智的方式;因爲你正在爲每個按鈕創建一個全新的匿名類,僅僅是爲了存儲一個不同的小值。這些可以快速添加在有限的設備上。更好的主意是將currentRect的值作爲每個按鈕的標籤存儲。這樣,您可以在外部類中聲明匿名類的單個實例,並將其用於所有按鈕。