Addactionlistener不接受参数

时间:2013-09-23 11:55:01

标签: java image swing jbutton actionlistener

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Concentration extends JFrame implements ActionListener {

    private JButton buttons[][]=new JButton[4][4];
    int i,j,n;      

    public Concentration() {            
        super ("Concentration");    
        JFrame frame=new JFrame();
        setSize(1000,1000);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel=new JPanel(new GridLayout(4,4));
        panel.setSize(400, 400);            
        for( i=0; i<buttons.length; i++){
            for (j=0; j<buttons[i].length;j++){ 
                n=i*buttons.length+buttons[i].length;
                buttons[i][j]=new JButton();                    
                panel.add(buttons[i][j]);
                buttons[i][j].addActionListener(this);
            }
        }
        add(panel);
        pack();
        setVisible(true);       
    }

    public void actionPerformed(ActionEvent e) {            
        buttons[i][j].setIcon(new ImageIcon(
                 getClass().getResource("/images/2.jpg")));
    }

    public static void main(String args[]){
        new Concentration();
    }    
}

这是我的代码。我正在做记忆游戏。我想这样做,每次点击一个按钮,该按钮显示图像,但

 buttons[i][j].addActionListener(this);

在那,methot不能拿i和j并且不显示任何图像。

但是例如当我做的时候

 buttons[2][2].addActionListener(this);

仅在2x2中显示。图片。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:3)

可能的解决方案:

  • 在ActionListener中,遍历按钮数组以查看数组中的哪个JButton与按下的按钮匹配,通过调用e.getSource()
  • 获得
  • 为您的JButton提供与i和j
  • 对应的actionCommand字符串
  • 创建一个单独的ActionListener实现类,该类具有可以通过构造函数设置的i和j字段,并为每个按钮提供一个唯一的ActionListener,其中设置了i和j。

答案 1 :(得分:2)

试试这段代码:

public void actionPerformed(ActionEvent e) {
    if(e.getSource() instanceof JButton){
        JButton pressedButton = (JButton) e.getSource();
        if(pressedButton.getIcon() == null){
            pressedButton.setIcon(new ImageIcon(getClass().getResource("/images/2.jpg")));
        } else {
            pressedButton.setIcon(null);
        }
    }
}

直接表单EventObject javadoc:

  

public Object getSource()

     

最初发生事件的对象。

     

返回:       事件最初发生的对象。

这意味着不需要知道按下按钮的数组索引,因为它可以通过getSource()方法知道。