动态按钮上的事件监听器

时间:2014-03-24 18:55:41

标签: java arrays swing model-view-controller jbutton

我一直在努力解决这个问题,我试图构建一个利用MVC模式的程序,它根据用户输入动态创建一个按钮网格(nxn)。但是我无法将听众附加到他们身上。

编辑:我的意思是我想在Controller类中处理事件以符合MVC模式

查看

public class AIGameView extends javax.swing.JFrame {

private AIGameModel model;
private JButton[][] btn_arr;

public AIGameView(AIGameModel m) {
    model = m;
    initComponents();
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {...}                                 

private void startBtnActionPerformed(java.awt.event.ActionEvent evt) {                                         
    options.setVisible(false);
    int size = Integer.parseInt(size_field.getText());
    model.setSize(size);
    btn_arr = new JButton[size][size];
    GameGUI.setLayout(new java.awt.GridLayout(size, size));
    for(int y = 0; y < size; y++)  {
        for(int x = 0; x < size; x++)  {
            btn_arr[y][x] = new JButton();
            btn_arr[y][x].setBackground(Color.white);
            GameGUI.add(btn_arr[y][x]);
            btn_arr[y][x].setVisible(true);

        }
    }
    GameGUI.setVisible(true);
    GameGUI.revalidate();
    GameGUI.repaint();
}        

控制器

public class AIGameController {

private AIGameView view;
private AIGameModel model;
private JButton[][] buttons;

public AIGameController(AIGameModel m, AIGameView v)    {
    view = v;
    model = m;
}

我已经尝试了几件事,但似乎没有什么可以解决这个问题,而且我最终只是以空指针异常结束。对此有何建议?

2 个答案:

答案 0 :(得分:1)

从您目前发布的代码中,您似乎可以添加一个电话

btn_arr[y][x] = new JButton();
btn_arr[y][x].addActionListener(createActionListener(y, x));
...

使用像

这样的方法
private ActionListener createActionListener(final int y, final int x)
{
    return new ActionListener()
    {
        @Override 
        public void actionPerformed(ActionEvent e)
        {
            System.out.println("Clicked "+y+" "+x);

            // Some method that should be called in 
            // response to the button click:
            clickedButton(y,x);
        }
    };
}

private void clickedButton(int y, int x)
{
    // Do whatever has to be done now...
}

答案 1 :(得分:0)

当你进行初始化循环时:

for(int x = 0; x < size; x++)  {
  btn_arr[y][x] = new JButton();
  btn_arr[y][x].setBackground(Color.white);
  GameGUI.add(btn_arr[y][x]);
  btn_arr[y][x].setVisible(true);
  btn_arr[y][x].addActionListener( new YourListener() );
}