Java实现了ActionListener问题

时间:2011-01-30 15:00:23

标签: java swing

关于我的previous problem,我现在遇到了一个新问题。为了避免内部类,我的类现在实现了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。

谢谢。

4 个答案:

答案 0 :(得分:5)

您的听众可以很好地收听所有按钮中的事件。你的问题是你似乎相信你只能操纵类字段。实际上,您根本不需要letterButton字段来执行您要执行的操作:

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

答案 1 :(得分:2)

您的动作听众正在聆听您的所有按钮。但是,您只能在最后一个按钮上进行检查。

而是做这样的事情:

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

答案 2 :(得分:2)

实际上你提供的内容中缺少很多代码。我怀疑letterButton是你班上的一个字段。因此,您在for循环中反复指定此字段(通过letterButton = new JButton(buttonText);)。

ActionListener然后与你的字段(最后一个按钮)进行比较,因此只用按钮'z'触发。

可能的解决方案:在按钮上使用actionCommand来识别按下了哪个按钮。

答案 3 :(得分:0)

<击> 我认为你最好不要使用匿名内部类或私有内部类来做你正在尝试做的事情 - 让你的gui类实现ActionListener。话虽如此,这个声明不是倒退吗?

action.getSource() == letterButton

事实上,这条线甚至可以编译吗?如果确实如此,我会感到惊讶,因为你试图为一个没有意义的方法调用赋值。

更好的是

letterButton == action.getSource();

你知道为什么吗?

编辑:忽略上面的垃圾。没有足够的睡眠或咖啡因。叹息....

另外,我回复了你之前关于使用匿名内部类的方法的线程,而不必担心将变量声明为final。