绑定监听事件的按钮运行结果错误原因及其解决方案

简介: 既然是窗口大小和按钮大小相同,那么一定是设置宽高的代码出现了问题,由于我们要使得代码冗余度降低,所以把按钮对象建在类中,所以在本类中的 this 关键字代表的就是JFrame窗体的大小,而不是按钮的大小

一、前言


在前面讲述有关监听事件的知识点时,为了能够直观看到其成效,我们用三个实例来演示了给按钮和界面绑定监听以后的效果,但是在实际自己写的过程中就遇到了一写小小的问题,对应也就是知识点的欠缺,这里我们总结一下


二、窗口大小变为按钮大小


1.错误效果展示


f740109ae3314323b88e6a4334a051f5.png


2.原因分析


既然是窗口大小和按钮大小相同,那么一定是设置宽高的代码出现了问题,由于我们要使得代码冗余度降低,所以把按钮对象建在类中,所以在本类中的 this 关键字代表的就是JFrame窗体的大小,而不是按钮的大小


3.错误代码


import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class test extends JFrame implements MouseListener {
    //创建按钮对象
    JButton jtb1 = new JButton("点击我有惊喜");
  public test(){
    //按钮设置宽高
        this.setBounds(0,0,200,50);
        //绑定鼠标事件
        jtb1.addMouseListener(this);
        //将按钮放在界面中
        this.getContentPane().add(jtb1);
  }
}


4.解决方案


解决方案也很简单,只需要把this.setBounds(0,0,200,50);改为jtb1.setBounds(0,0,200,50);即可


5.正确代码


import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class test extends JFrame implements MouseListener {
    //创建按钮对象
    JButton jtb1 = new JButton("点击我有惊喜");
  public test(){
    //按钮设置宽高
        jtb1.setBounds(0,0,200,50);
        //绑定鼠标事件
        jtb1.addMouseListener(this);
        //将按钮放在界面中
        this.getContentPane().add(jtb1);
  }
}


6.知识点


this关键字的用处是调用成员变量中的值,而不是通过就近原则调用方法里的值;这个错误所对应的知识点是【构造方法及this关键字】


三、键盘监听运行结果不同


1.错误效果展示


f740109ae3314323b88e6a4334a051f5.png


2.原因分析


虽然这个错误界面和上面很像,但是原因不同,在【Java中的键盘监听机制(含实例)】其实就有提到过,对于键盘监听,我们要给整个页面添加监听事件,而不是新建一个按钮,所以如果偷懒复制黏贴上面的代码就会出错


3.错误代码


import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class test extends JFrame implements MouseListener {
    //创建按钮对象
    JButton jtb1 = new JButton("点击我有惊喜");
  public test(){
    //按钮设置宽高
        this.setBounds(0,0,200,50);
        //绑定键盘监听事件
        this.addKeyListener(this);
        //设置界面可视化
        this.setVisible(true);
  }
}


4.解决方案


既然都没有创建按钮了,setBounds这行的代码也就可以删除了,只要删除这行代码,程序就可以运行出我们想要的结果了


5.正确代码


import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class test extends JFrame implements MouseListener {
    //创建按钮对象
    JButton jtb1 = new JButton("点击我有惊喜");
  public test(){
        //绑定键盘监听事件
        this.addKeyListener(this);
        //设置界面可视化
        this.setVisible(true);
  }
}


四、结语


这里遇到的问题都是博主在自己尝试独立写出这部分代码时碰到的一些问题,如果别的小伙伴也在写拼图小游戏的过程中遇到问题,或者有疑惑的话,欢迎在评论区留言,如果文章中有错误也可以指出,我也会及时改进

相关文章
|
26天前
|
机器学习/深度学习 人工智能 算法
水稻病害检测数据集(7000 张图片已划分)| AI 训练适用于目标检测任务
本数据集包含7000张已标注水稻病害图像,涵盖细菌性叶斑病、褐斑病和叶霉病三类常见病害,适用于目标检测任务。数据按8:1:1划分训练集、验证集与测试集,标注格式支持YOLO等主流模型,可直接用于AI训练与部署,助力智慧农业病害识别研究。
水稻病害检测数据集(7000 张图片已划分)| AI 训练适用于目标检测任务
|
数据采集 监控 数据可视化
Scrapy可视化管理管理工具总结
Scrapy可视化管理管理工具总结
1678 0
Scrapy可视化管理管理工具总结
|
开发工具 git
NotionNext 笔记博客部署 图文教程①
如何使用NotionNext工具将Notion笔记实时渲染成静态博客网站,从创建Notion账号、复制模板、获取页面ID、复制源代码到Vercel部署的完整步骤。
NotionNext 笔记博客部署 图文教程①
|
存储 监控 数据管理
如何设置绿联云与PC电脑同步?
【7月更文挑战第1天】如何设置绿联云与PC电脑同步?
3957 2
|
存储 测试技术 开发工具
Wujian SoC 平台_介绍|学习笔记
快速学习 Wujian SoC 平台_介绍
578 0
Wujian SoC 平台_介绍|学习笔记
|
存储 人工智能 安全
AI伦理与法规:确保技术安全可控
【7月更文第20天】随着人工智能(AI)技术的飞速发展,其在医疗、金融、教育、交通等领域的应用日益广泛,极大地推动了社会进步和经济发展。然而,AI的广泛应用也引发了诸多伦理问题和对个人隐私的潜在威胁,这些挑战要求我们在追求技术创新的同时,必须建立和完善相应的伦理规范与法律法规框架,以确保技术的安全可控。本文将探讨AI发展中的主要伦理问题、隐私保护策略以及相关的法律法规,并通过代码示例展示如何在实践中实施隐私保护措施。
1030 0
|
安全 数据安全/隐私保护
如何设置多因素认证,但不使用短信验证码?
【5月更文挑战第14天】如何设置多因素认证,但不使用短信验证码?
615 0
QGS
|
数据库
Centos7-X86单机部署国产人大金仓数据库
记Centos7-X86单机部署国产人大金仓数据库
QGS
722 0
Centos7-X86单机部署国产人大金仓数据库
第8章 概率统计——8.3 累积概率分布
第8章 概率统计——8.3 累积概率分布
第8章 概率统计——8.3 累积概率分布
|
存储 关系型数据库 MySQL
【MySQL】varbinary 真的比varchar 更合适?
一 前言     在讨论数据表字段设计的时候,有同学提出使用vabinary 代替 varchar ,部分开发不明所以,其实我也是。两者之间具体有什么区别?使用vabinary 代替 varchar 对业务有何优势?本文尝试从性能,数据大小,查询,创建索引等对比功能等方面进行研究,有不妥或者不到位之处还请各位读者朋友提示。
3137 0