事件监听:当某个事情发生的时候,要做什么操作
目录
简单事件监听
输入框事件监听
简易计算器
画 笔
鼠标监听
窗口监控
键盘监听
简单事件监听
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和“你按了上键”
如果觉得《事件监听(窗口关闭 输入框事件 计算器 画笔 鼠标 窗口 键盘)》对你有帮助,请点赞、收藏,并留下你的观点哦!