将 MouseListener 添加到面板

2024-05-16

我正在尝试将鼠标操作添加到我的面板中。 这就是程序应该做的事情:

编写一个程序,允许用户通过按三下鼠标来指定一个三角形。第一次按下鼠标后,画一个小点。第二次按下鼠标后,绘制一条连接前两个点的线。第三次按下鼠标后,绘制整个三角形。第四次按下鼠标会擦除旧三角形并开始一个新三角形。


我强烈建议您先通读一下如何编写鼠标监听器 https://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html。当您遇到困难时,这些教程(和 JavaDocs)是最好的起点

您的问题的“立即”答案是,您需要注册一个实例MouseListener与你的组件,也许像......

private JPanel createCenterPanel() {

    panel.addMouseListener(new MouseListen());
    //panel.setLayout(null);


    return panel;
}

这将“回答”您眼前的问题。

然而,你会发现很难尝试将这些人的行为结合起来。MouseListener与面板,需要绘制结果。

更好的解决方案可能是从JPanel它管理自己的MouseListener

Also, Graphics g = panel.getGraphics()不是应该如何执行自定义绘画。看一眼执行自定义绘画以了解更多细节 https://docs.oracle.com/javase/tutorial/uiswing/painting/index.html

所以,相反,它可能看起来更像......

public class TrianglePanel extends JPanel {

    private List<Point> points = new ArrayList<>(3);

    public TrianglePanel() {
        addMouseListener(new MouseListen());
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.

        if (points.size() < 1) {
            return;
        }
        for (int index = 0; index < points.size(); index++) {
            Point nextPoint = points.get(index);
            g.fillOval(nextPoint.x - 2, nextPoint.y - 2, 4, 4);
        }

        Point startPoint = points.get(0);
        Point lastPoint = startPoint;
        for (int index = 1; index < points.size(); index++) {
            Point nextPoint = points.get(index);
            g.drawLine(lastPoint.x, lastPoint.y, nextPoint.x, nextPoint.y);
            lastPoint = nextPoint;
        }
        g.drawLine(lastPoint.x, lastPoint.y, startPoint.x, startPoint.y);
    }

    class MouseListen extends MouseAdapter {

        public void mouseReleased(MouseEvent e) {
            if (points.size() < 3) {
                points.add(e.getPoint());
                repaint();
            }
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 MouseListener 添加到面板 的相关文章

随机推荐

  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • LibreOffice 并行将 .docx 转换为 .pdf 效果不佳

    我有很多 docx 文件需要转换为 pdf 将它们一一转换需要很长时间 所以我编写了一个 python 脚本来并行转换它们 from subprocess import Popen import time import os os chdi
  • 从文本文件中读取阿拉伯字符

    我完成了一个项目 在该项目中我读取了用记事本编写的文本文件 我的文本文件中的字符是阿拉伯语 文件编码类型是UTF 8 当在 Netbeans 7 0 1 中启动我的项目时 一切似乎都正常 但是当我将项目构建为 jar 文件时 字符以这种方式
  • 如何使用额外标记输出 wp_list_categories

    我目前正在使用下面的脚本在无序列表中输出我的所有 WordPress 类别 如何获得带有额外标记的输出 ul ul 例如 ul li Category 1 rsaquo li li Category 2 rsaquo li ul 代替 ul
  • 错误[E0554]:#![功能]可能无法在稳定发布通道上使用无法使用货物安装赛车

    我正在尝试使用 Cargo 安装 Racer 所以我执行了命令cargo install racer在终端中并导致错误 error E0554 feature may not be used on the stable release ch
  • 检查 XML 元素是否存在

    如何验证 XML 文件中是否存在特定元素 假设我有一个不断变化的 XML 文件 我需要在读取 解析它之前验证每个元素是否存在 if doc SelectSingleNode mynode null 应该这样做 显然 其中 doc 是您的 X
  • 将构造函数作为参数传递给方法

    我是java新手 开始研究构造函数 我看到一些构造函数作为参数传递给方法的示例 请告诉我当构造函数作为参数传递给方法时会发生什么 或者建议我一些链接 我可以在其中获得有关使用构造函数的足够知识 根据您需要传递构造函数的目的 您可以考虑传递供
  • 为什么我的混淆矩阵只返回一个数字?

    我正在做二元分类 每当我的预测等于事实时 我发现sklearn metrics confusion matrix返回单个值 难道没有问题吗 from sklearn metrics import confusion matrix print
  • 从 Google 电子表格接收实时更新

    我正在尝试设置与 Google 电子表格的双向同步 我可以使用其数据集将更改推送到 Google 电子表格Google 表格 API V4 https developers google com sheets 现在 我希望每当有人实时或近实
  • DbGeography 多边形到 JSON

    我将 DbGeography 多边形存储在数据库中 我的控制器从数据库获取多边形 我需要将它们转换为 JSON var polygons db Areas Where x gt x Type type Select x gt new Vie
  • JSON 中的哈希到底是什么?

    我正在学习 JSON 但我发现你也可以将所谓的 哈希 放入 JSON 中 我在哪里可以找到什么是哈希 或者你能向我解释一下什么是哈希吗 另外 什么是哈希图 我有 C 和 C 经验 正在学习 JS Jquery 和 JSON 哈希是一个稀疏数
  • 与 SQL 中的 IN 运算符相反

    我怎么能做相反的事情 换句话说 选择所有姓氏不是 Hansen 或 Pettersen 的人 WHERE lastname NOT IN Hansen Pettersen 请参阅 IN 和 NOT IN 运算符 部分SQLite 所理解的
  • linq2sql,存储库模式 - 如何从两个或多个表查询数据?

    我使用存储库模式 和 linq2sql 作为数据访问 并拥有例如 ProductsRep 和 CustomersRep 在非常简单的场景中 数据库有两个表 产品 产品 ID 客户 ID 产品名称 日期 和顾客 客户 ID 名字 姓氏 每个存
  • 实体框架中的批量插入

    我使用批量插入插入大量记录 例如 20K 当我仅插入一个实体时 它会正常工作 但是 当我用来插入多个实体 例如一对多 时 它将仅插入父实体 而不会插入子实体 我的实体和代码 Customer cs public class Customer
  • 使用 pandas.date_range() 生成多个日期时间,每周两个日期

    我在用着pd date range start date end date freq W MON 每周一生成每周频率日期时间start date 2017 01 01 and end date 2017 12 31 这意味着每月大约生成 4
  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • ValueError:请使用“Layer”实例初始化“TimeDistributed”层

    我正在尝试构建一个可以在音频和视频样本上进行训练的模型 但出现此错误ValueError Please initialize TimeDistributed layer with a Layer instance You passed Te
  • Laravel Passport,通过密码客户端进行多个连接

    我无法理解如何使用 Laravel Passport 通过密码客户端为同一用户实现多个连接 我有一个移动应用程序 需要与基于 Laravel 的 API 进行通信 我的用户在首次启动应用程序时必须输入他们的login and passwor
  • 两个日期范围之间相交的天数

    有人知道如何最好地计算两个日期范围之间相交的天数吗 这是我写的一个小方法来计算这个 private static int inclusiveDays DateTime s1 DateTime e1 DateTime s2 DateTime
  • 将 MouseListener 添加到面板

    我正在尝试将鼠标操作添加到我的面板中 这就是程序应该做的事情 编写一个程序 允许用户通过按三下鼠标来指定一个三角形 第一次按下鼠标后 画一个小点 第二次按下鼠标后 绘制一条连接前两个点的线 第三次按下鼠标后 绘制整个三角形 第四次按下鼠标会