5

我正在尝试创建一个由单元格组成的 10 x 10 网格的 Java 游戏。网格看起来像这样:

public class Grid extends JPanel implements MouseListener {
    public static final int GRID_SIZE = 10;

    public Grid() {
        setPreferredSize(new Dimension(300, 300));
        setLayout(new GridLayout(GRID_SIZE, GRID_SIZE));

        for (int x = 0; x < GRID_SIZE; x++)
            for (int y = 0; y < GRID_SIZE; y++)
                add(new Cell(x, y));
        addMouseListener(this);
    }

// All Mouse Listener methods are in here.

Cell 类如下所示:

public class Cell extends JPanel {

    public static final int CELL_SIZE = 1;
    private int xPos;
    private int yPos;

    public Cell (int x, int y) {
        xPos = x;
        yPos = y;
        setOpaque(true);
        setBorder(BorderFactory.createBevelBorder(CELL_SIZE));
        setBackground(new Color(105, 120, 105));
        setPreferredSize(new Dimension(CELL_SIZE, CELL_SIZE));
    }

    // Getter methods for x and y.

我的问题是我现在正在尝试在 Grid 类中实现 MouseListeners。我已经意识到,虽然我可以返回网格的 X 和 Y 坐标,但我似乎无法操纵单元格本身。我假设这是因为当我在 Grid 中创建它们时,我正在创建 100 个没有标识符的随机单元格,因此我无法直接访问它们。

有人可以给我建议吗?我是否需要彻底检查我的代码和创建单元的方式?我是否非常愚蠢并且错过了访问它们的明显方式?谢谢

4

3 回答 3

2

您可以使用适配器模式,如下所示。这样,您可以将侦听器单独添加到每个网格单元,但仍可以处理来自Grid.

请注意,Grid不再实现MouseListener,现在由单元处理。

public class Grid extends JPanel {
    public static final int GRID_SIZE = 10;

    public Grid() {
        setPreferredSize(new Dimension(300, 300));
        setLayout(new GridLayout(GRID_SIZE, GRID_SIZE));

        for (int x = 0; x < GRID_SIZE; x++) {
            for (int y = 0; y < GRID_SIZE; y++) {
                final Cell cell = new Cell(x, y);
                add(cell);
                cell.addMouseListener(new MouseListener() {
                    public void mouseClicked(MouseEvent e) {
                        click(e, cell);
                    }
                    // other mouse listener functions
                });
            }
        }        
    }

    public void click(MouseEvent e, Cell cell) {
        // handle the event, for instance
        cell.setBackground(Color.blue);
    }

    // handlers for the other mouse events
}

子类可以将其覆盖为:

public class EnemyGrid extends Grid {
    public void click(MouseEvent e, Cell cell) {
        cell.setBackground(Color.red);
    }
}
于 2013-04-24T13:17:16.143 回答
2
于 2013-04-24T13:22:40.340 回答
1

最明显的方法是让你MouseListenerCell课堂上移动。

我能想到的第二个选择是使用java.awt.Container.getComponentAt(int, int).

于 2013-04-24T13:57:30.910 回答