Создание сетки кнопок в Java Swing с MVC - PullRequest
1 голос
/ 14 апреля 2020

Я создаю игру 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");
            }            
        }
    }
}
...