如何使用 MouseListener 查找网格中的特定单元格

2023-11-27

我正在尝试创建一个由单元格组成的 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 个没有标识符的随机单元格,因此我无法直接访问它们。

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


您可以使用适配器模式,如下所示。这样,您可以将侦听器单独添加到每个网格单元,但仍然处理来自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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 MouseListener 查找网格中的特定单元格 的相关文章

随机推荐

  • 以编程方式读取应用程序的 logcat

    我读了本文已经 但它显示的大部分文本似乎不在我的应用程序中 如何过滤消息并让它仅显示我的应用程序的日志 换句话说 我想像 Android Studio 中的那样显示它 仅显示我的应用程序的错误日志 显示时间戳等 我尝试了类似 logcat
  • “RefVariable”对象没有属性“_id”

    我正在尝试训练线性回归模型来预测金县的房价 我是按照教程一步步操作的 然而 当我最小化损失函数时 我收到错误 RefVariable object has no attribute id 我正在遵循一个简单的教程来学习如何训练简单的线性回归
  • ubuntu下安卓模拟器没有声音

    我正在 ubuntu 19 10 中运行 android 模拟器 我尝试了以下解决方案 但没有结果 Link 1 Link 2 Link 3 Error 1 10 PM Emulator pulseaudio pa context conn
  • 像在 Java 中一样在 Swift 中使用套接字

    如果我想连接到服务器 在 Java 中我会打开一个 Socket 并使用端口和主机地址对其进行初始化 然后检索输入 输出流并读 写我想要的任何内容 在 Swift 中 我很难这样做 因为它不是那样构建的 我真的很想看到一个简单的示例 说明如
  • dlopen 失败:无法打开共享对象文件:没有这样的文件或目录

    问题是我使用dlopen加载一个库 so是我写的 它不是系统库 但我得到了标题中所示的错误 我已经包括了dlfcn h 在编译器中 我使用了 ldl command 我想要加载的只是源代码文件夹 我尝试添加 L 但没有成功 找出代码出错位置
  • R:通过引用函数传递 data.frame

    我通过一个data frame作为想要更改内部数据的函数的参数 x lt data frame value c 1 2 3 4 f lt function d for i in 1 nrow d if d value i 2 0 d val
  • 如何知道用户点击了“X”或“关闭”按钮?

    在MSDN中我发现CloseReason UserClosing知道用户已决定关闭表单 但我想单击 X 按钮或单击关闭按钮是相同的 那么我如何在代码中区分这两者呢 谢谢大家 假设您需要 WinForms 您可以使用FormClosing 事
  • 在 emacs python shell 中重新加载更改的 python 文件

    在 emacs Python shell 我正在运行 2 Python 中 我正在导入一个正在使用的 py 文件并测试代码 但是 如果我更改代码 我不知道如何再次导入它 从我到目前为止的阅读看来 reload modulename 应该有效
  • 在 AsyncTask 中获取上下文

    我正在尝试获取名为 Opciones 的类的 AsyncTask 中的上下文 该类是唯一调用该任务的类 但我不知道该怎么做 我看到了一些如下代码 protected void onPostExecute Long result Toast
  • 如何指定 FCM 消息的优先级?

    我正在使用 React native firebase 来管理 React native 应用程序上的通知 当应用程序关闭时 我尝试在后台处理 FCM 消息而不显示通知 我正在使用 React native firebase 来管理 Rea
  • 按编号搜索并使用 ABAddressBook 获取图像

    我希望使用号码作为键通过我的应用程序在 iphone 地址簿中进行搜索 然后检索与该联系人关联的图像并将其显示在 UIImageView 上 我尝试使用 ABAddressBook 框架 但无法继续 任何人都可以建议我解决方案或我可以遵循的
  • 绝对导入会导致 ModuleNotFoundError

    Python 3 6 我已经编写了一些组件 并且正在尝试将其中一个组件导入另一个组件中 下面是我的项目结构 components init py extract python3 init py extract py transform py
  • Laravel 5.2 中 auth()->user() 为 null

    我刚刚将 Composer 更新到 Laravel 5 2 无法查看受密码保护的页面 基本上下面的代码行不起作用 auth gt user 有人可以建议为什么这不起作用吗 确保任何需要会话 Auth 使用的 的路由都位于 web 中间件组
  • 使用应用内购买来解锁功能与使用 iPhone 的免费和付费应用版本

    我有一个应用程序 我打算将其作为具有部分全部功能的免费 精简版 版本和具有高级功能的付费完整版本发布 现在 通过在应用程序内购买免费应用程序 我正在考虑走这条路 能够根据需要解锁功能 我不是在谈论过期的试用版 基本上 我希望人们能够试用该应
  • 创建未知类型的数组

    我有一个对象 我必须验证该问题的值 对象的一些属性是自定义对象的数组 这样它将涉及到对数组的各个元素进行一些深入研究 为每个元素执行 getter 例如 AttribGrp x Object getAttribGrp x i getSome
  • 在.net中加载dll而不锁定它

    我正在执行一项任务 其中我必须加载 dll 并从中获取一些信息 例如类名等 但是当我将该 dll 加载到我的代码中时 它被锁定并且无法从源代码构建 直到我关闭加载程序 我尝试了某些解决方案 但没有一个适合我 Shadowcopy 在这种情况
  • 如何在 AngularJS 中动态更改 CSS 属性

    现在我有一个背景图像 URL 硬编码到 CSS 中 我想使用 AngularJS 中的逻辑动态选择背景图像 这是我目前拥有的 HTML div class offer detail image div div CSS offer detai
  • IPython Notebook 错误:加载笔记本时出错

    在过去的几分钟内 我无法访问任何 ipynb以前用Python3 4创建的文件 我进入包含这些文件的子目录 输入 ipython3 notebook 当我打开 新 笔记本时 出现以下错误 Unexpected error while sav
  • 服务层中的授权和用户信息(.NET 应用程序)

    我目前正在 NET 环境 n 层 中使用企业应用程序 我想知道在我的 BusinessLayer BL 中管理身份验证 授权 数据过滤的最佳方法 我们将从多个接口 ASP NET 应用程序和 Web 服务 使用该 BL 我认为我的 Serv
  • 如何使用 MouseListener 查找网格中的特定单元格

    我正在尝试创建一个由单元格组成的 10 x 10 网格的 Java 游戏 网格看起来像这样 public class Grid extends JPanel implements MouseListener public static fi