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

简介: 既然是窗口大小和按钮大小相同,那么一定是设置宽高的代码出现了问题,由于我们要使得代码冗余度降低,所以把按钮对象建在类中,所以在本类中的 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);
  }
}


四、结语


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

相关文章
|
人工智能 机器人 人机交互
哥大华人开发人脸机器人,照镜子自主模仿人类表情超逼真
【4月更文挑战第3天】哥伦比亚大学研究人员开发了一款名为Emo的机器人,能观察并模仿人类面部表情,实现更自然的人机交互。Emo配备26个面部执行器和高分辨率摄像头,通过“自我建模”学习模仿表情,并能预测人类表情变化。这一创新有望改善人机理解和响应情绪的能力,应用于教育、医疗等领域,但也引发了关于情感依赖和伦理问题的讨论。
314 4
哥大华人开发人脸机器人,照镜子自主模仿人类表情超逼真
|
供应链 物联网 区块链
探索未来:新技术趋势与应用在现代社会的融合
随着科技的迅猛发展,新兴技术如区块链、物联网(IoT)、虚拟现实(VR)等正逐渐渗透到我们生活的每一个角落。这些技术不仅改变了我们的生活方式,也重新定义了各行各业的运作模式。本文将深入探讨这些技术的发展趋势和应用场景,揭示它们如何塑造未来的社会结构。
138 27
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
387 2
|
11月前
|
自然语言处理 Python
六、Flask模板使用方法
六、Flask模板使用方法
243 0
|
机器学习/深度学习 测试技术 API
【Python-Keras】Keras搭建神经网络模型的Model解析与使用
这篇文章详细介绍了Keras中搭建神经网络模型的`Model`类及其API方法,包括模型配置、训练、评估、预测等,并展示了如何使用Sequential模型和函数式模型来构建和训练神经网络。
382 1
|
前端开发 Java 开发者
Spring Boot DevTools 热部署神器,助你在开发浪潮中乘风破浪,一骑绝尘!
【8月更文挑战第29天】在快速迭代的软件开发领域,高效开发至关重要。Spring Boot DevTools 作为一款优秀的热部署工具,可自动重新加载代码修改,无需手动重启应用,大幅节省时间,即时预览修改效果,简化开发流程。通过简单示例,展示了其自动刷新静态资源和模板文件的功能,有效提升了开发效率,使开发者更专注于功能实现。它就像是开发者的得力助手,显著减少等待时间,带来更高效、流畅的开发体验。
131 0
|
机器学习/深度学习 人工智能 自然语言处理
揭开AI的神秘面纱:人工智能简介
这是一篇人工智能简介,从人工智能的定义,起源,分类,相关技术,应用前景与存在的挑战几个方面介绍人工智能
|
JavaScript 前端开发 UED
video标签里面的路径怎么填
video标签里面的路径怎么填
231 0
|
API 网络架构
企微获客链接 中文乱码问题处理
【6月更文挑战第6天】企微获客链接 中文乱码问题处理
|
SQL 安全 Java
SQL server 2017安装教程
SQL server 2017安装教程
526 1