2011-01-30 57 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来标识按下哪个按钮。