Я создаю игру Battleships с дизайном MVC. Я изо всех сил пытаюсь создать доску (сетку) ячеек, чтобы я мог иметь действие контроллера при нажатии на ячейку. Прямо сейчас я просто хочу нажать кнопку, чтобы распечатать его координаты x & y, сохраненные в модели. Это так, позже я могу сохранить другие данные в модели и получить те же кнопки управления. Ниже приведено то, что у меня есть, и я не могу выдать то, что хочу. Цель состоит в том, чтобы создать сетку кнопок, где нажатие одного выводит его координаты, но через контроллер. Примите во внимание некоторые советы, если я неправильно интерпретировал MVC, но правильная реализация этой сетки кнопок является основным направлением.
CellView
package View;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
public class CellView extends JButton implements ActionListener {
private int x, y;
public CellView(int x, int y) {
this.x=x;
this.y=y;
setBorder(new LineBorder(Color.GRAY));
setBackground(null);
this.addActionListener(this);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
colorCell();
}
});
}
public void print(ActionListener listenForWhatever) {
this.addActionListener(listenForWhatever);
//System.out.println(getX() + " " + getY());
}
protected void colorCell() {
if (getBackground() != Color.DARK_GRAY) {
setBackground(Color.DARK_GRAY);
} else {
setBackground(null);
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(20, 20);
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public void actionPerformed(ActionEvent e) {
this.addActionListener(this);
}
}
BoardView
package View;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JPanel;
public class BoardView extends JPanel{
public BoardView() {
addSquares();
}
private void addSquares() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
for (int y = 0; y < 10; y++) {
gbc.gridy = y;
for (int x = 0; x < 10; x++) {
gbc.gridx = x;
add(new CellView(x,y), gbc);
}
}
}
}
CellModel
package Model;
public class CellModel {
private int x, y;
public CellModel(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
BoardModel
package Model;
public class BoardModel {
public static final int BOARD_DIMENSION = 10;
private CellModel[][] cells;
public BoardModel() {
cells = new CellModel[BOARD_DIMENSION][BOARD_DIMENSION];
// populates the squares array
for (int i = 0; i < BOARD_DIMENSION; i++) {
for (int j = 0; j < BOARD_DIMENSION; j++) {
cells[i][j] = new CellModel(i, j);
}
}
}
public CellModel getCell(int x, int y) {
return cells[x][y];
}
}
Контроллер
package Controller;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import Model.BoardModel;
import Model.CellModel;
import View.BoardView;
import View.CellView;
public class Controller {
private BoardView theView;
private BoardModel theModel;
public Controller(BoardView theView, BoardModel theModel) {
this.theView = theView;
this.theModel = theModel;
this.theView.print(new PrintListener());
}
class PrintListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
int X = 0, Y = 0;
try{
X = theView.getSquares(x,y).getX();
Y = theView.getY();
System.out.println(theModel.getCell(x, y));
}
catch(NumberFormatException ex){
System.out.println("error");
}
}
}
}