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

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


四、结语


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

相关文章
|
2月前
|
小程序 UED 开发者
小程序如何监听页面的滚动事件
小程序如何监听页面的滚动事件
62 0
|
4天前
|
JavaScript
大事件项目06-注册功能_点击事件和拿到数据
大事件项目06-注册功能_点击事件和拿到数据
|
2月前
|
开发者
在用户关闭页面时,提示用户有内容未保存-论onbeforeunload事件的用法
在用户关闭页面时,提示用户有内容未保存-论onbeforeunload事件的用法
44 0
|
12月前
|
C#
C#利用委托实现命令按钮跨窗体控制
C#利用委托实现命令按钮跨窗体控制
95 0
|
JSON 小程序 JavaScript
【小程序】页面事件
【小程序】页面事件
131 0
【小程序】页面事件
|
缓存
Element 通知组件 Notification 支持同类型的提示信息只弹出一次!!!
Element 使用闭坑指南 • ElementUI 为 DatePicker 日期选择器组件添加前缀说明文字 • 生成以周统计的表头,跨月份的周算在后一个月 • Element Table 可以实现哪些常见的有用的功能 • Element UI Loading 加载组件动态变更 text 值(加载文案)
904 0
Element 通知组件 Notification 支持同类型的提示信息只弹出一次!!!
|
索引
【mpvue】列表项组件事件前10个触发正常,后面的组件触发不正常
1、问题描述 父级列表页,将列表项做成自定义组件ItemList,监听子组件的click事件,获取当前子组件实例所在数组的索引值。 发现前10个子组件实例触发click时,console.log能正确输出该组件所在数组的索引值,但是后续的子组件实例触发click时输出的并非该组件所在数组的索引值。 下面是控制台打印的内容:
88 0
|
Android开发 开发者
如何捕获一个Activity页面上所有的点击行为
最近逛wanAndroid论坛,发现一个有趣的问题:如何捕获一个Activity页面上所有的点击行为。
105 0
|
小程序 API
开发技巧 | mPaaS 小程序自定义事件,如何取消注册?
在我们开发 mPaaS 小程序的过程中,如果已有小程序 API 或事件无法满足开发需求,您也可以自行扩展。
6457 0
开发技巧 | mPaaS 小程序自定义事件,如何取消注册?