2014-06-24 22 views
0

我遇到了一個問題,我無法找到解決方案,在Java圍繞JButtons旋轉。ActionListener找到按下JButton的正確名稱(不是出現的字符串)?

,因爲我想保持我的代碼「清潔」,我已經聲明採用以下for環我所有的按鈕:

JButton[] buttons= new JButton[10]; 
for(int i = 0;i < buttons.length;i++){ 
    buttons[i] = new JButton("Example "+i); 
    contents2.add(buttons[i]); 
    buttons[i].addActionListener(listener);} 

而且ActionListener的listener如下:

ActionListener listener = new ActionListener() { 
     public void actionPerformed (ActionEvent actionEvent) { 
      if(actionEvent.getSource() == (JButton)buttons[1].getSource()){ 
       System.out.println("Test"); 
      } 
     } 
    }; 

然而然後buttonsif(actionEvent.getSource() == (JButton)buttons[1].getSource())有Eclipse告訴我按鈕不能解析爲變量。

在同一行中,我也試過沒有(JButton),在buttons[1]之後沒有.getSource(),還有更多的組合。

我迷惑了自己,但是我只是想要在listener中執行的動作發生,如果按下的按鈕是_

對不起,如果你明白這一點,任何幫助將不勝感激。除了我想要的東西之外,我只是不斷收到字符串。

+2

有很多問題可能導致這種情況,但沒有更多的上下文很難知道你正在遭受哪一個(多個)問題。考慮提供一個[可運行示例](https:// stackoverflow。com/help/mcve),這將證明你的問題,這將減少猜測工作,併產生更好的響應 – MadProgrammer

+2

'因爲我想保持我的代碼'更乾淨',那麼你不應該有if/else(或switch)語句ActionListener。如果按鈕具有類似的功能,那麼你應該做一些像[計算器面板]中的示例(http://stackoverflow.com/questions/21434873/setting-up-keylisteners-using-the-mvc-in-java/21436635# 21436635)。如果功能不能通用,那麼你應該創建單獨的ActionListeners。 – camickr

回答

1

您可以使用setActionCommand方法在動作偵聽器中使用,而不是使用不存在的源代碼。

樣本:

ActionListener listener = new ActionListener() { 
     public void actionPerformed (ActionEvent actionEvent) { 
      String index = actionEvent.getActionCommand(); 

      switch(Integer.valueOf(index)){ 
       case 1: //your actions here for index 1 of button 
       break; 
      } 
     } 
    }; 

final JButton[] buttons= new JButton[10]; 
    for(int i = 0;i < buttons.length;i++){ 
     buttons[i] = new JButton("Example "+i); 
     contents2.add(buttons[i]); 
     buttons[i].setActionCommand(i+""); 
     buttons[i].addActionListener(listener); 
    } 

正如你可以看到action command是你的按鈕的索引,所以你可以使用switch語句對每個按鈕進行操作。

case 1表示您的Button陣列的index 1

+0

因此,我們不是提供更清潔的解決方案,而是引入了更低效的解決方案。另外,Java 7允許你在'switch'語句中使用'String' – MadProgrammer

+0

@MadProgrammer yes你是對的switch語句允許字符串,但是它比整數更慢,因爲它會使用equals方法迭代每個case語句vs integer將使用散列表的速度爲O(1) –

+0

@MadProgrammer 10個實例不,它只是一個,我試圖做的是創建一個實例,並使用case語句爲每個按鈕,將使用ActionListener –

1

ActionListener可能在JButton數組之前被聲明。

相反,聲明buttons作爲一個實例變量...

public class SomeClass extends ... { 
    private JButton[] buttons; 

那麼你應該能夠使用

if(actionEvent.getSource() == buttons[1]){ 

當構建你的按鈕數組引用buttonsActionListener,你也將需要確保你不影響你的變量,例如...

buttons= new JButton[10]; 
for(int i = 0;i < buttons.length;i++){ 

說了這麼多,如果你想清理你的代碼,那麼我建議你看看How to use Actions,它提供了一個可重用的API動作,它可以附加到按鈕,菜單項和鍵綁定