我有这个任务,我们必须使用模型视图分离创建类似于Candy Crush的游戏。我在网格上的每个位置都有一个5x5 GridLayout
和JButtons
。每个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;
}
}