2011-01-30 58 views
3

關於我的previous problem,我現在有一個新問題。爲了避免內部課堂,我的課程現在實現了actionListener。我的代碼如下:Java實現ActionListener問題

public class MainGame extends JDialog implements ActionListener { 

    public MainGame(JDialog owner) { 
     super(owner, true); 
     initComponents(); 
     jPanel1.setLayout(new GridLayout(3, 9, 3, 5)); 
     for (char buttonChar = 'a'; buttonChar <= 'z'; buttonChar++) { 
      String buttonText = String.valueOf(buttonChar); 
      letterButton = new JButton(buttonText); 
      letterButton.addActionListener(this); 
      jPanel1.add(letterButton); 
     } 

     newGame(); 
    } 

    public void actionPerformed (ActionEvent action){ 
     if (action.getSource() == letterButton) { 
      letterButton.setEnabled(false); 
     } 
    } 

我該如何影響聽衆對我的按鈕A到Z?因爲它所能聽到的全部是最後一個按鈕,在本例中爲按鈕Z.

謝謝。

回答

5

你聽衆可以聽從所有按鈕的事件就好。你的問題是你似乎相信你只能操作類字段。事實上,你並不需要letterButton場在所有你想要做什麼:

public void actionPerformed (ActionEvent action){ 
    ((JButton)action.getSource()).setEnabled(false); 
} 
2

您的動作偵聽器正在偵聽您的所有按鈕。但是,您只是在最後一個按鈕上進行檢查。

而是做這樣的事情:

if(action.getSource() instanceof JButton){ 
    ((JButton)action.getSource()).setEnabled(false); 
} 
+0

我怎麼能這樣做? – newbie 2011-01-30 15:05:15

+0

等待我看到你的問題,讓我編輯我的答案。 – jzd 2011-01-30 15:08:28

0

我認爲你是好得多使用或者匿名內部類或私有內部類這不是做你想要做什麼的權利現在 - 讓你的gui類實現ActionListener。這就是說,這不是反語嗎?

action.getSource() == letterButton 

其實,這行甚至編譯?如果它試圖爲方法調用分配一個值是沒有意義的,我會感到驚訝。

更好的將是

letterButton == action.getSource(); 

你知道爲什麼嗎?

編輯:忽略上面的廢話。沒有足夠的睡眠或咖啡因。嘆息....

此外,我已經回答了你以前的線程關於一種使用匿名內部類的方法,而不必擔心將變量聲明爲final。

+0

@Hovercraft Full Of Eels你應該怎麼做? – newbie 2011-01-30 15:06:54

2

其實有大量的碼缺少你所付出的。我懷疑letterButton是你班上的一個領域。因此,您可以在for循環中一遍又一遍地分配此字段(通過letterButton = new JButton(buttonText);)。

ActionListener然後與您的字段進行比較(這是當時的最後一個按鈕),因此只能通過按鈕'z'觸發。

可能的解決方案:在按鈕上使用actionCommand來標識按下哪個按鈕。