Java的事件监听机制
2016.6.06
1.事件监听机制
事件源对象:接收动作的对象
(1)有哪些内容可以成为事件源对象呢?
所有的容器组件和元素组件都可以成为事件源对象。
(2)在图形界面上会有很多的组件,如何确定谁是事件源对象呢?
通俗的讲,你的动作在哪一个组件上发生的,那这个组件对象就是事件源对象。
(3)事件监听方法:捕获事件源对象上的动作
事件监听方法是事件源对象提供的;如果事件源对象没有提供对应的事件监听方法,那就无法捕获事件源对象上的对应动作。如何理解这句话呢?比如现在你的事件源对象是一个按钮吧,那么按钮给你提供了捕获按钮被按下、释放这些动作的方法,所以当鼠标按下按钮时会产生一系列反应。但你按键盘的回车缺不会有反应,就是因为按钮并没有提供捕获键盘动作的方法,其它组件也是类似的道理。捕获动作的方法有事件源对象提供的,事件源对象有这种方法你才能去捕获相应的动作信息。所以要监听一个对象时,首先应该分析它有什么动作,捕获动作的方法有哪些。(具体参考JDK 1.6API文档)
事件源对象:接收动作的对象
(1)有哪些内容可以成为事件源对象呢?
所有的容器组件和元素组件都可以成为事件源对象。
(2)在图形界面上会有很多的组件,如何确定谁是事件源对象呢?
通俗的讲,你的动作在哪一个组件上发生的,那这个组件对象就是事件源对象。
(3)事件监听方法:捕获事件源对象上的动作
事件监听方法是事件源对象提供的;如果事件源对象没有提供对应的事件监听方法,那就无法捕获事件源对象上的对应动作。如何理解这句话呢?比如现在你的事件源对象是一个按钮吧,那么按钮给你提供了捕获按钮被按下、释放这些动作的方法,所以当鼠标按下按钮时会产生一系列反应。但你按键盘的回车缺不会有反应,就是因为按钮并没有提供捕获键盘动作的方法,其它组件也是类似的道理。捕获动作的方法有事件源对象提供的,事件源对象有这种方法你才能去捕获相应的动作信息。所以要监听一个对象时,首先应该分析它有什么动作,捕获动作的方法有哪些。(具体参考JDK 1.6API文档)
(4)之前说过接口类并不能实例化对象,但Java提供了监听方法的接口,如果你要对一个组件进行监听,那么你需要写一个对应的类,同时重写接口函数。比如监听一个按钮,那么你需要写一个ButtonListener类,注意接口的继承关键字:implemens。Java提供的动作监听方法以及其它一些常用的监听方法如下:
addActionListener(ActionListener l) 动作事件监听方法
捕获类似按钮组件上的鼠标点击动作和捕获类似输入框组件上的键盘回车动作;然后收集事件源对象的信息和动作信息, 再将这些信息交给ActionListener参数对象。
addMouseListener(MouseListener l);鼠标动作事件监听方法,捕获事件源对象上的鼠标按下、释放、点击、进入和离开动作
addMouseMotionListener(MouseMotionListener l);鼠标移动动作事件监听方法,捕获事件源对象上的鼠标移动和拖动动作
addKeyListener(KeyListener l);键盘动作事件监听方法,捕获事件源对象上的按键按下,释放和敲击动作
所有以add开头以Listener结尾的都是事件监听方法。
(5) 事件接口:处理动作的接口(接口不能实例对象,定义类实现接口,这个类就称之为事件处理类,方法就是事件处理方法[动作的处理方法])
ActionListener 动作事件接口(Java提供的接口)
actionPerformed(ActionEvent e) 发生动作后,执行的方法,收集到的对象信息和动作信息就交给ActionEvent的对象(e),简单的讲!就是当这个动作发生以后你想干什么,就把你想干的事写到这个方法里面。
addActionListener(ActionListener l) 动作事件监听方法
捕获类似按钮组件上的鼠标点击动作和捕获类似输入框组件上的键盘回车动作;然后收集事件源对象的信息和动作信息, 再将这些信息交给ActionListener参数对象。
addMouseListener(MouseListener l);鼠标动作事件监听方法,捕获事件源对象上的鼠标按下、释放、点击、进入和离开动作
addMouseMotionListener(MouseMotionListener l);鼠标移动动作事件监听方法,捕获事件源对象上的鼠标移动和拖动动作
addKeyListener(KeyListener l);键盘动作事件监听方法,捕获事件源对象上的按键按下,释放和敲击动作
所有以add开头以Listener结尾的都是事件监听方法。
(5) 事件接口:处理动作的接口(接口不能实例对象,定义类实现接口,这个类就称之为事件处理类,方法就是事件处理方法[动作的处理方法])
ActionListener 动作事件接口(Java提供的接口)
actionPerformed(ActionEvent e) 发生动作后,执行的方法,收集到的对象信息和动作信息就交给ActionEvent的对象(e),简单的讲!就是当这个动作发生以后你想干什么,就把你想干的事写到这个方法里面。
(6) 下面来个简单的例子:
目标:点击登录界面上的登录按钮,显示一个新窗体,然后再关闭登录窗体。
事件监听机制
事件源对象:登录按钮
事件监听方法:addActionListener(ActionListener l)
事件接口:ActionListener
实现步骤:
1.定义LoginListener事件处理类,该类实现ActionListener动作事件接口,重写接口中所有的抽象方法;
目标:点击登录界面上的登录按钮,显示一个新窗体,然后再关闭登录窗体。
事件监听机制
事件源对象:登录按钮
事件监听方法:addActionListener(ActionListener l)
事件接口:ActionListener
实现步骤:
1.定义LoginListener事件处理类,该类实现ActionListener动作事件接口,重写接口中所有的抽象方法;
分析: 就像我前面说的,要写一个监听类,然后调用监听方法的接口,话不多说,直接上代码:
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JLabel;
import java.awt.Dimension;
public class Loginlistener implements ActionListener
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JLabel;
import java.awt.Dimension;
public class Loginlistener implements ActionListener
{
public void actionPerformed(ActionEvent e) {
public void actionPerformed(ActionEvent e) {
//此函数里面写你要做的事情,比如我现在要模拟登陆的过程。
}
}
2.在actionPerformed事件处理方法中,实例化JFrame对象设置窗体的属性值;
分析:意思就是定义一个新的窗体,并设置它的属性。代码如下:
// 实例化一个新的JFrame窗体对象
JFrame frame = new JFrame();
frame.setTitle("New JFrame");//窗体显示的标题
frame.setSize(700,500);//窗体大小
frame.setDefaultCloseOperation(3);//窗体关闭的形式
frame.setLocationRelativeTo(null);//窗体居中显示
frame.setVisible(true);//设置窗体可见
3.声明登录窗体的属性,定义设置登录窗体属性值的方法,最后调用登录窗体的关闭方法;
JFrame frame = new JFrame();
frame.setTitle("New JFrame");//窗体显示的标题
frame.setSize(700,500);//窗体大小
frame.setDefaultCloseOperation(3);//窗体关闭的形式
frame.setLocationRelativeTo(null);//窗体居中显示
frame.setVisible(true);//设置窗体可见
3.声明登录窗体的属性,定义设置登录窗体属性值的方法,最后调用登录窗体的关闭方法;
分析:登陆窗体在另一个类里面要怎么调用关闭函数呢?设想一下。假如我上课没有带笔,
而你有笔,我要写字,那我该怎么办呢?当然是向 你借啦。所以可以在 Loginlistener
里面声明一个Login类的对象,然后就可以调用dispos()了。
4.实例化LoginListener事件处理类的对象,将登录窗体传递到LoginListener的对象中;
4.实例化LoginListener事件处理类的对象,将登录窗体传递到LoginListener的对象中;
分析:因为要关闭登陆窗体,所以窗体需要被传递到LoginListener类中去。
5.给登录按钮事件源对象添加addActionListener()动作事件监听方法,指定LoginListener事件处理类的对象。
5.给登录按钮事件源对象添加addActionListener()动作事件监听方法,指定LoginListener事件处理类的对象。
分析:通俗的讲就是安装摄像头监控啦。
完整代码在下面的练习中补充:
2.练习
(1).点击登录界面上的登录按钮,显示一个新窗体,然后再关闭登录窗体。
(2).在登录界面的账号和密码输入框中输入文字信息,然后点击登录界面上的登录按钮,对输入的账号和密码做验证,如果 正确则显示一个新窗体,然后再关闭登录窗体;如果不正确则显示错误窗体。
(3).点击计算器界面上的按钮,将按钮上的文字显示在输入框中。
登陆界面:
2.练习
(1).点击登录界面上的登录按钮,显示一个新窗体,然后再关闭登录窗体。
(2).在登录界面的账号和密码输入框中输入文字信息,然后点击登录界面上的登录按钮,对输入的账号和密码做验证,如果 正确则显示一个新窗体,然后再关闭登录窗体;如果不正确则显示错误窗体。
(3).点击计算器界面上的按钮,将按钮上的文字显示在输入框中。
登陆界面:
import java.awt.Dimension;
public class Login531 {
public static void main(String[] args) {
Login531 L = new Login531();
L.Inin();
}
public void Inin(){
javax.swing.JFrame frame = new javax.swing.JFrame();
java.awt.FlowLayout f1 = new java.awt.FlowLayout();
javax.swing.ImageIcon img = new javax.swing.ImageIcon("你的图片路径");
javax.swing.JLabel l1 = new javax.swing.JLabel(img);
javax.swing.JLabel textname = new javax.swing.JLabel("登陆名");
javax.swing.JLabel passname = new javax.swing.JLabel("密码");
javax.swing.JTextField Textname = new javax.swing.JTextField(14);
javax.swing.JPasswordField Passname = new javax.swing.JPasswordField(10);
javax.swing.JButton bu_login = new javax.swing.JButton("登陆");
frame.setDefaultCloseOperation(3);
frame.setLayout(f1);
frame.setTitle("Login");
l1.setPreferredSize(new Dimension(180,180));
frame.add(l1);
frame.add(textname);
frame.add(Textname);
textname.setPreferredSize( new Dimension(80 ,20));
frame.add(passname);
frame.add(Passname);
frame.add(bu_login);
frame.setSize(400,400);
frame.add(bu_login);
frame.setVisible(true);
Loginlistener ll = new Loginlistener();
ll.setLogin(frame);
ll.setText(Textname);
ll.setPass(Passname);
bu_login.addActionListener(ll);
}
}
监听类:
public class Login531 {
public static void main(String[] args) {
Login531 L = new Login531();
L.Inin();
}
public void Inin(){
javax.swing.JFrame frame = new javax.swing.JFrame();
java.awt.FlowLayout f1 = new java.awt.FlowLayout();
javax.swing.ImageIcon img = new javax.swing.ImageIcon("你的图片路径");
javax.swing.JLabel l1 = new javax.swing.JLabel(img);
javax.swing.JLabel textname = new javax.swing.JLabel("登陆名");
javax.swing.JLabel passname = new javax.swing.JLabel("密码");
javax.swing.JTextField Textname = new javax.swing.JTextField(14);
javax.swing.JPasswordField Passname = new javax.swing.JPasswordField(10);
javax.swing.JButton bu_login = new javax.swing.JButton("登陆");
frame.setDefaultCloseOperation(3);
frame.setLayout(f1);
frame.setTitle("Login");
l1.setPreferredSize(new Dimension(180,180));
frame.add(l1);
frame.add(textname);
frame.add(Textname);
textname.setPreferredSize( new Dimension(80 ,20));
frame.add(passname);
frame.add(Passname);
frame.add(bu_login);
frame.setSize(400,400);
frame.add(bu_login);
frame.setVisible(true);
Loginlistener ll = new Loginlistener();
ll.setLogin(frame);
ll.setText(Textname);
ll.setPass(Passname);
bu_login.addActionListener(ll);
}
}
监听类:
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JLabel;
import java.awt.Dimension;
public class Loginlistener implements ActionListener{
private JFrame login;
private JTextField TextName;
private JPasswordField pass;;
public void setPass(JPasswordField p)
{
pass = p;
}
public void setLogin(JFrame l)
{
login = l;
}
public void setText(JTextField T)
{
TextName = T;
}
public void actionPerformed(ActionEvent e) {
// 实例化一个新的JFrame窗体对象
String S=TextName.getText();
char Sp[] = pass.getPassword();
String str = new String(Sp);
if(S.equals("1234")&& str.equals("123"))
{
JFrame frame = new JFrame();
frame.setTitle("New JFrame");
frame.setSize(700,500);
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);//setLocation()有什么区别
frame.setVisible(true);
login.dispose();
}
else
{
JFrame frame = new JFrame();
frame.setTitle("Wrong JFrame");
frame.setSize(700,500);
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);//setLocation()有什么区别
frame.setVisible(true);
JLabel la = new JLabel("输入错误!");
la.setPreferredSize(new Dimension(200,200));
frame.add(la);
}
}
然后是计算器的:
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JLabel;
import java.awt.Dimension;
public class Loginlistener implements ActionListener{
private JFrame login;
private JTextField TextName;
private JPasswordField pass;;
public void setPass(JPasswordField p)
{
pass = p;
}
public void setLogin(JFrame l)
{
login = l;
}
public void setText(JTextField T)
{
TextName = T;
}
public void actionPerformed(ActionEvent e) {
// 实例化一个新的JFrame窗体对象
String S=TextName.getText();
char Sp[] = pass.getPassword();
String str = new String(Sp);
if(S.equals("1234")&& str.equals("123"))
{
JFrame frame = new JFrame();
frame.setTitle("New JFrame");
frame.setSize(700,500);
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);//setLocation()有什么区别
frame.setVisible(true);
login.dispose();
}
else
{
JFrame frame = new JFrame();
frame.setTitle("Wrong JFrame");
frame.setSize(700,500);
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);//setLocation()有什么区别
frame.setVisible(true);
JLabel la = new JLabel("输入错误!");
la.setPreferredSize(new Dimension(200,200));
frame.add(la);
}
}
然后是计算器的:
public class Cal {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cal C = new Cal();
C.Inin();
}
public void Inin(){
javax.swing.JFrame frame = new javax.swing.JFrame();
java.awt.FlowLayout f1 = new java.awt.FlowLayout(java.awt.FlowLayout.CENTER,20,20);
frame.setSize(600,800);
frame.setTitle("计算器");
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);
javax.swing.JTextArea ta = new javax.swing.JTextArea();
String str[]={"%","根号","平方","倒数","CE","C","<--","/","+","-","=","."};
ta.setPreferredSize(new java.awt.Dimension(300,200));
frame.add(ta);
for(int i=0;i<12;i++)
{
javax.swing.JButton B9 = new javax.swing.JButton(" "+str[i]);
frame.add(B9);
ButtonListener B = new ButtonListener();
B.setArea(ta);
B9.addActionListener(B);
}
frame.setLayout(f1);
frame.setVisible(true);
}
}
}
计算器按钮的监听类:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextArea;
public class ButtonListener implements ActionListener{
private JTextArea text;//将text对象传递过来,因为我要将按钮返回的字符串显示到JTextArea里面
public void setArea(JTextArea T)
{
text = T;
}
public void actionPerformed(ActionEvent e)
{
text.setText(text.getText()+" "+e.getActionCommand());
}
}
import java.awt.event.ActionListener;
import javax.swing.JTextArea;
public class ButtonListener implements ActionListener{
private JTextArea text;//将text对象传递过来,因为我要将按钮返回的字符串显示到JTextArea里面
public void setArea(JTextArea T)
{
text = T;
}
public void actionPerformed(ActionEvent e)
{
text.setText(text.getText()+" "+e.getActionCommand());
}
}
加油!