事件监听:当某个事情发生的时候,要做什么操作


目录

简单事件监听

输入框事件监听

简易计算器

画 笔

鼠标监听

窗口监控

键盘监听


​​​​​​​

简单事件监听

1、关闭窗口

// 希望:按下按钮,可以触发一些事件
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class ActionEvent {public static void main(String[] args) {Frame frame = new Frame();Button button = new Button();// 因为 addActionListener() 需要一个 ActionListener// 所以我们需要构造一个 ActionListenerMyActionListener myActionListener = new MyActionListener();button.addActionListener(myActionListener);frame.add(button, BorderLayout.CENTER);frame.setSize(300,300);windowClose(frame); //关闭窗口frame.setVisible(true);}// 关闭窗口的事件private static void windowClose (Frame frame) {frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}// 事件监听
class MyActionListener implements ActionListener {@Overridepublic void actionPerformed(java.awt.event.ActionEvent e) {System.out.println('a'); //点击按钮时输出a}
}

2、两个按钮共享一个事件

import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;// 两个按钮,实现同一个监听
public class ActionTwo {public static void main(String[] args) {Frame frame = new Frame("开始-停止");Button button1 = new Button("start");Button button2 = new Button("stop");button2.setActionCommand("button2-stop");MyMonitor myMonitor = new MyMonitor();button1.addActionListener(myMonitor);button2.addActionListener(myMonitor);frame.add(button1, BorderLayout.NORTH);frame.add(button2, BorderLayout.SOUTH);frame.pack();frame.setVisible(true);}
}class MyMonitor implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {// e.getActionCommand() 获得按钮的信息System.out.println("按钮被点击了:msg=> " + e.getActionCommand());}
}

输入框事件监听

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TextAction {public static void main(String[] args) {new MyFrame1();}
}class MyFrame1 extends Frame {public MyFrame1() {TextField textField = new TextField();add(textField);//监听这个文本框输入的文字MyActionListener1 myActionListener1 = new MyActionListener1();//按下enter,就会触发这个输入框监听事件textField.addActionListener(myActionListener1);setVisible(true);pack();}
}class MyActionListener1 implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {// 因为 public Object getSource(),故可向上转型TextField field = (TextField) e.getSource(); //获得一些资源,返回的一个对象System.out.println(field.getText()); //获得输入框的文本}
}

  • 加强版:隐藏输入字符
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TextAction {public static void main(String[] args) {new MyFrame1();}
}class MyFrame1 extends Frame {public MyFrame1() {TextField textField = new TextField();add(textField);//监听这个文本框输入的文字MyActionListener1 myActionListener1 = new MyActionListener1();//按下enter,就会触发这个输入框监听事件textField.addActionListener(myActionListener1);//设置替换编码(文本框显示的是替换编码,开发人员看到的是正常文字)textField.setEchoChar('*');setVisible(true);pack();}
}class MyActionListener1 implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {// 因为 public Object getSource(),故可向上转型TextField field = (TextField) e.getSource(); //获得一些资源,返回的一个对象System.out.println(field.getText()); //获得输入框的文本// 回车清空field.setText(""); // null 是对象,""是空字符串,二者不同}
}

简易计算器

  • 页面:包含三个文本框(加数、被加数、和),一个标签+,一个按钮=
  • 功能:输入加数和被加数后,点击=按钮,显示和的同时,清除加数、被加数

1、面向过程编程

import java.awt.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Calculator {public static void main(String[] args) {new Calc();}
}// 计算器类
class Calc extends Frame{public Calc(){// 3个文本框 ——》 加数、被加数、和TextField num1 = new TextField(10); //字符数TextField num2 = new TextField(10); //字符数TextField num3 = new TextField(20); //字符数// 1个按钮 ——》 ‘=’Button button = new Button("=");button.addActionListener(new MyCalculatorLisenter(num1, num2, num3));// 1个标签 ——》 ‘+’Label label = new Label("+");//布局 ——》 流式布局setLayout(new FlowLayout());//组合add(num1);add(label);add(num2);add(button);add(num3);pack();setVisible(true);}
}//监听器类
class MyCalculatorLisenter implements ActionListener{// 获取三个变量private TextField num1, num2, num3;public MyCalculatorLisenter(TextField num1, TextField num2, TextField num3){this.num1 = num1;this.num2 = num2;this.num3 = num3;}@Overridepublic void actionPerformed(ActionEvent e) {// 1、获得加数和被加数int n1 = Integer.parseInt(num1.getText());int n2 = Integer.parseInt(num2.getText());// 2、将两个数相加,放入第三个框num3.setText(""+(n1+n2));// 3、清楚前两个框num1.setText("");num2.setText("");}
}

2、完全面向对象编程(利用组合)

public class Calculator {public static void main(String[] args) {new Calc().loadFrame();}
}// 计算器类
class Calc extends Frame {// 属性TextField num1, num2, num3;//方法public void loadFrame() {num1 = new TextField(10); //字符数num2 = new TextField(10); //字符数num3 = new TextField(20); //字符数Button button = new Button("=");Label label = new Label("+");button.addActionListener(new MyCalculatorLisenter(this));//布局setLayout(new FlowLayout());//组合add(num1);add(label);add(num2);add(button);add(num3);pack();setVisible(true);}
}// 监听器类
class MyCalculatorLisenter implements ActionListener {// 获取计算器这个对象,在一个类中组合另外一个类Calc calc = null;public MyCalculatorLisenter(Calc calc){this.calc = calc;}@Overridepublic void actionPerformed(ActionEvent e) {int n1 = Integer.parseInt(calc.num1.getText());int n2 = Integer.parseInt(calc.num2.getText());calc.num3.setText("" + (n1+n2) );calc.num1.setText("");calc.num2.setText("");}
}

3、内部类:畅通无阻地访问外部类的属性和方法(但在一些特殊情况中内部类并不能优化代码,故要看实际情况来使用内部类)

public class Calculator {public static void main(String[] args) {new Calc().loadFrame();}
}// 计算器类
class Calc extends Frame {// 属性TextField num1, num2, num3;//方法public void loadFrame() {num1 = new TextField(10); //字符数num2 = new TextField(10); //字符数num3 = new TextField(20); //字符数Button button = new Button("=");Label label = new Label("+");button.addActionListener(new MyCalculatorLisenter());//布局setLayout(new FlowLayout());//组合add(num1);add(label);add(num2);add(button);add(num3);pack();setVisible(true);}// 监听器类private class MyCalculatorLisenter implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {int n1 = Integer.parseInt(num1.getText());int n2 = Integer.parseInt(num2.getText());num3.setText("" + (n1+n2) );num1.setText("");num2.setText("");}}}

画 笔

手动设置画笔颜色,以及绘画图案,使其运行后直接显示在框架中

import java.awt.*;public class AutoPaint {public static void main(String[] args) {new MyPaint().loadFrame();}
}class MyPaint extends Frame {//设置窗口public void loadFrame() {setBounds(200,200,600,500);setVisible(true);}//画笔public void paint(Graphics g) {//画笔——需要有颜色g.setColor(Color.red);g.drawOval(100,100,100,100);g.setColor(Color.MAGENTA);g.fillOval(300,300,100,100);//实心圆//习惯:将画笔设置为最初的颜色——黑色g.setColor(Color.black);}
}

鼠标监听

1、目的:想要实现鼠标画画

2、思路:

3、代码

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;// 鼠标监听事件
public class MousePaint {public static void main(String[] args) {new MyFrame2("Draw");}
}//画板
class MyFrame2 extends Frame {//存 点(画画需要画笔,需要监听鼠标当前的位置,需要集合来存储这个点)ArrayList points;public MyFrame2(String title){super(title);setBounds(200,200,400,300);//存鼠标点击的点points = new ArrayList();setVisible(true);//鼠标器监听器,针对这个窗口this.addMouseListener(new MyMouseListener());}@Overridepublic void paint(Graphics g) {//画画,监听鼠标的事件// Iterator(迭代器)Iterator iterator = points.iterator();while (iterator.hasNext()) {Point point = (Point) iterator.next();g.setColor(Color.magenta);g.fillOval(point.x,point.y,10,10); //点实际上是一个小圆}}//添加一个点到界面上public void addPaint(Point point) {points.add(point);}//内部类//适配器模式private class MyMouseListener extends MouseAdapter {//鼠标————按下、弹起、按住不放@Overridepublic void mousePressed(MouseEvent e) {MyFrame2 myFrame2 = (MyFrame2) e.getSource();//我们点击鼠标的时候,就会在界面上产生一个点————鼠标的点myFrame2.addPaint( new Point( e.getX(), e.getY() ) );//每次点击鼠标都需要重新画一遍myFrame2.repaint(); //刷新}}
}

4、效果(点是我自己画的)

5、知识拓展

(1)ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素

(2)Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合

  • 调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态
  • 调用 it.hasNext() 用于检测集合中是否还有元素
  • 调用 it.remove() 将迭代器返回的元素删除

窗口监控

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class WindowFrame {public static void main(String[] args) {new MyWindowFrame();}
}class MyWindowFrame extends Frame {public MyWindowFrame() {setBackground(Color.BLUE);setBounds(100,100,200,200);setVisible(true);this.addWindowListener(//匿名内部类new WindowAdapter() {//关闭窗口@Overridepublic void windowClosing(WindowEvent e) {System.out.println("windowClosing");System.exit(0); //关闭窗口}//激活窗口@Overridepublic void windowActivated(WindowEvent e) {System.out.println("windowActivated");}});}
}

键盘监听

1、代码

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;public class KeyListener {public static void main(String[] args) {new KeyFrame();}
}class KeyFrame extends Frame {public KeyFrame() {setBounds(1,2,300,400);setVisible(true);this.addKeyListener(new KeyAdapter() {//键盘按下@Overridepublic void keyPressed(KeyEvent e) {//获得键盘下的键是哪一个,当前的码int KeyCode = e.getKeyCode(); //不需要去记这个数值,直接使用静态属性 VK_xxx 即可System.out.println(KeyCode);if (KeyCode == KeyEvent.VK_UP){System.out.println("你按了上键");}// 根据按键的不同操作,产生不同结果}});}
}

2、效果

  • 解释:键盘输入7,输出103;   输入q,输出81;   输入i,输出73;   按向上的按钮,输出38和“你按了上键”

事件监听(窗口关闭、输入框事件、计算器、画笔、鼠标、窗口、键盘)相关推荐

  1. JAVA之旅(三十一)——JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件

    JAVA之旅(三十一)--JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件 有段时间没有更新JAVA了,我们今天来说一下JAVA中的图形化界面,也就是GUI ...

  2. GUI 事件监听和文本框事件监听

    4.事件监听 事件监听:什么事情发生了,需要做什么? 什么事情是事件,做什么?是我们编辑的功能 事件:是鼠标事件,键盘事件等. 例如鼠标按下,要下载音乐 键盘按下哪一个按键,需要执行什么操作 publ ...

  3. JAVA的GUI编程02——事件监听(ActionListener)、TextField事件监听、(组合、内部类)

    一.事件监听 public class TestListener {public static void main(String[] args) {Frame frame = new Frame(); ...

  4. java中事件监听_Java中的事件监听机制

    鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...

  5. Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析

    文章目录 Pre 实现原理 应用 配置类 Event事件 事件监听 EventListener 发布事件 publishEvent 源码解析 (反推) Spring默认的事件广播器 SimpleApp ...

  6. angular4点击事件监听_JavaScript从零开始——DOM事件编程(1)

    事件的本质是程序各个组成部分之间的一种通信方式,也是异步编程的一种实现.DOM 支持大量的事件,本章开始,我们一起看看 DOM 的事件编程. 1 概念 DOM 的事件操作(监听和触发),都定义在Eve ...

  7. js监听浏览器关闭页面事件

    window.onbeforeunload = function() {//功能函数 } window.onbeforeunload = function(e) {var e = window.eve ...

  8. JS事件监听手机屏幕触摸事件 Touch

    JS移动客户端--触屏滑动事件 移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的t ...

  9. easyui控件事件监听委托给jquery事件监听,keyup取最新值问题

    <div id="<?php echo NS; ?>toolbar"><div style="padding:5px">&l ...

  10. javaScript如何监听浏览器关闭事件

    转载链接:http://www.cnblogs.com/Tim_Liu/archive/2010/11/09/1872596.html 最近写东西的时候发现需要对浏览器的关闭进行监听, 当用户关闭的时 ...

最新文章

  1. cmd pc如何开多个微信_Win10下个人微信与企业微信多开
  2. 八十一、使用Springboot实现发邮件的需求
  3. (效果一)js实现上拉加载
  4. 设置Java EE 6开发环境
  5. 让你的sublime text写C代码 (sublime text 2 配置构建C开发环境)
  6. UDP报文观测以及DNS的工作原理
  7. 只能在执行Render() 的过程中调用 RegisterForEventValidation;
  8. centos7 单机安装 greenplum6
  9. xshell6和xftp6的安装
  10. ARM开发初级-Windows环境下的STM32开发环境搭建(包含missing compiler version 5的解决方法)-学习笔记02
  11. linux测试usb显示速率,linux 测试usb写入和读取速度
  12. xubuntu20.04安装记
  13. iBeacon距离测量误差有多大
  14. 用python验证谷角猜想_角谷猜想 - 寂寞暴走伤的个人空间 - OSCHINA - 中文开源技术交流社区...
  15. 【VUE】浏览器消息通知(声音提醒,标题栏闪动,弹框提醒)
  16. python 爬虫程序详解
  17. qwt3d在qt5里面的编译问题
  18. 【消息队列笔记】chp2-如何选择消息队列
  19. VIM源生linux代码编辑器使用
  20. Intel历史上最强的竞争对手:但并不是AMD

热门文章

  1. 软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day1)
  2. 网络显示其他计算机不全,win7系统网络邻居显示不全只能看到2台计算机的解决方法...
  3. 使用Kinect2作为Oculus游戏应用的输入设备
  4. 修改db_create_file_dest
  5. 获取flickr网站上某个用户的所有图片url
  6. Unrecognized Windows Sockets error: 10106: create 的解决
  7. HTTPClient模拟登陆开心网001(from javaeye)
  8. java contains 效率_List与Set的contains方法效率问题
  9. collect2: error: ld returned 1 exit status(Linux下Gcc编译问题)
  10. 然之协同 PHP,然之协同办公系统5.2开源版官方下载