如何引用其actionlistener中的按钮?

时间:2015-06-19 01:46:13

标签: java reference jframe actionlistener

我刚刚开始习惯听众,但我仍然不熟悉与他们合作。我需要在actionlistener中引用一个按钮来获取该按钮的文本。 我想要的代码是:

for(int i = 0; i<48; ++i){
        button[i] = new JButton("");
        contentPane.add(button[i]);
        button[i].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                x_marks_the_spot();
                if(button[i].getText().equals("X")){
                    increase_hit();
                }
                else{
                    increase_miss();
                }
            }
        });

显然我不能这样做,因为[i]实际上并不存在于代码的不存在部分。我确信通过获取源代码可以做到这一点,但我无法想到它。

2 个答案:

答案 0 :(得分:2)

  

通过获取源

来做到这一点

我相信你想要的是ActionEvent.getSource()

答案 1 :(得分:1)

  

显然我无法做到这一点,因为[i]实际上并不存在于代码的不存在部分。

您可以将i复制到final变量中来实现:

// Make a final copy of loop variable before making the listener
final tmpI = i;
...
// Use your final variable instead of `i` inside the listener
if(button[tmpI].getText().equals("X")){

但是,这不是最有效的方法,因为每个按钮都需要自己的侦听器对象,并且代码中存储了对tmpI的引用。

您可以创建一个ActionListener对象,并在所有按钮之间共享,如下所示:

ActionListener listener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        x_marks_the_spot();
        JButton sender = (JButton)e.getSource();
        if(sender.getText().equals("X")){
            increase_hit();
        } else{
            increase_miss();
        }
    }
};
for(int i = 0; i<48; ++i){
    button[i] = new JButton("");
    contentPane.add(button[i]);
    button[i].addActionListener(listener);
}