使EventHandler执行两个不同的操作

时间:2016-11-22 03:27:58

标签: java jbutton eventhandler

我有这个任务,我们必须使用模型视图分离创建类似于Candy Crush的游戏。我在网格上的每个位置都有一个5x5 GridLayoutJButtons。每个JButton都有一个随机颜色图标,使用模型中的方法调用。单击其中一个JButtons必须将按钮的边框更改为红色,然后单击相邻按钮必须交换按钮的内容或颜色。我使用ArrayList<ArrayList<String>>在我的模型中表示了一个5x5网格,其中字符串是用于ImageIcon的文件名。但是,我在交换部分遇到了麻烦。当我点击第一个JButton时,我可以将边框设置为红色,但点击另一个相邻的JButton高亮显示按钮也是红色,并且不会交换颜色。我不确定为什么EventHandler无法正常工作。有谁可以帮助我?

这是我的Model课程:

private ArrayList<String> _imageFileNames; 
private ArrayList<String> _store;
private ArrayList<ArrayList<String>> _currentValues; 
private int _firstX;
private int _firstY;

public Model() {
    _imageFileNames = new ArrayList<String>();
    _imageFileNames.add("Tile-0.png");
    _imageFileNames.add("Tile-1.png");
    _imageFileNames.add("Tile-2.png");
    _imageFileNames.add("Tile-3.png");
    _imageFileNames.add("Tile-4.png");
    _imageFileNames.add("Tile-5.png");

    _currentValues = new ArrayList<ArrayList<String>>();
    for (int x=0; x<5; ++x) {
        _store= new ArrayList<String>();
        for (int y=0; y<5; ++y) {
            Collections.shuffle(_imageFileNames);
            _store.add(_imageFileNames.get(0));
        }
        _currentValues.add(_store);
    }
}

public String setIcon(int x, int y) {
    return _currentValues.get(x).get(y);
}

public void firstClick(int x, int y) {
    _firstX = x;
    _firstY = y;
}

public void secondClick(int x, int y) {
    if (checkXAdjacent(x) || checkYAdjacent(y)) {
        String first = _currentValues.get(x).get(y);
        String second = _currentValues.get(_firstX).get(_firstY);
        String temp = _currentValues.get(x).get(y);
        first = _currentValues.get(_firstX).get(_firstY);
        second = temp;
    }
}

public boolean checkXAdjacent(int x) {
    if (_firstX != x) {
        if (x == _firstX + 1) {
            return true;
        }
        else if (x == _firstX - 1) {
            return true;
        }
        else {
            return false;
        }
    }
    else {
        return false;
    }
}

public boolean checkYAdjacent(int y) {
    if (_firstY != y) {
        if (y == _firstY + 1) {
            return true;
        }
        if (y == _firstY - 1) {
            return true;
        }
        else {
            return false;
        }
    }
    else {
        return false;
    }
}

这是我的View课程:

private JFrame _frame;
private Model _model;
public ArrayList<JButton> _buttons;

public UI() {
    _model = new Model();

    _frame = new JFrame("James Kang's Lab 10");
    _frame.getContentPane().setLayout(new GridLayout(5, 5));

    _buttons = new ArrayList<JButton>();
    for (int x=0; x<5; ++x) {
        for (int y=0; y<5; ++y) {
            JButton button = new JButton();
            button.setIcon(new ImageIcon("Images/" + _model.setIcon(x,y)));
            button.addActionListener(new EventHandler(_model, null, button, x, y));
            button.setOpaque(true);
            _buttons.add(button);
            _frame.add(button);
        }
    }

    _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    _frame.pack();
    _frame.setVisible(true);
}

public void update() {
    for (int x=0; x<5; ++x) {
        for (int y=0; y<5; ++y) {
            _buttons.get(y).setIcon(new ImageIcon(_model.setIcon(x, y)));
        }
    }
}

这是我的EventHandler

private Model _model;
private JButton _b;
private int _x;
private int _y;
private int _clicked;
private UI _ui;

public EventHandler(Model m, UI ui, JButton b, int x, int y) {
    _model = m;
    _b = b;
    _x = x;
    _y = y;
    _clicked = 0;
    _ui = ui;
}

@Override public void actionPerformed(ActionEvent e) {
    if (_clicked == 0) {
        _b.setBackground(Color.RED);
        _model.firstClick(_x, _y);
        _clicked = 1;
    }
    else if (_clicked == 1) {
        _b.setBackground(null);
        _model.secondClick(_x, _y);
        _ui.update();
        _clicked = 0;
    }
}

0 个答案:

没有答案