Java事件的监听机制
在Java中实现事件的监听,是通过实现监听接口然后添加监听器来实现的,这里就牵扯到了接口的概念。接口何为接口,其实就是Java中类的一个分支,是一种特殊的类。在接口定义的全都是抽象方法以及一些常量。
接口:
一、 接口的定义
1、接口的定义关键字是interface
2、定义的方式是:访问修饰符(访问修饰符只能是public或者是默认的) + interface + 接口名 { 接口内部的抽象方法以及常量 }。
3、接口可以继承接口(这里的继承是多继承)但是不能实现接口。
4、在接口中的定义的抽象方法只能是public abstract的。
5、在接口中可以定义静态常量也可以定义非静态常量。
二、接口的实现
1、实现接口的关键字是implements,一个类可以实现多个接口,但是在实现接口的时候必须重 写这个接口中所有的抽象方法(包括这个接口的父接口中所有的抽象方法)。
2、接口与它的实现类是一种继承的关系。
三、虽然Java中不支持多继承,但是通过接口这一机制变相的实现了多继承。
抽象类:
定义方式:
访问修饰符 + abstract class + 抽象类名 + {
/**可以定义属性,普通方法,构造方法,抽象方法(必须要加abstract关键字),常量
如果是抽象方法那么就不能写方法体
*/
}
事件的监听:
一、首先得确定事件源,所谓的事件源其实就是事件发生在谁的身上那么它就是事件源。(所有的swing和awt界面组件都可以成为事件源)。
二、事件的监听方法是通过给事件源添加事件处理类来实现事件的监听
addActionListener(ActionListener l);(鼠标单击(按钮,标签),回车操作(输入框))
addMouseListener(MouseListener l);(鼠标按下,释放,单击,进入,离开)
addMouseMotionListener(MouseMotionListener l); 鼠标移动和拖动
addKeyListener(KeyListener l); 键盘按下和释放。
三、事件处理类对象时通过定义类实现对应的接口,实现接口中的抽象方法来实现
下面是我写一个小登陆的程序来练习事件监听机制
package com.why.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; public class QQLogin extends JFrame { private static final long serialVersionUID = 1L; private JButton login; private JComboBox<String> username; private JPasswordField password; public static void main(String[] args) { // TODO Auto-generated method stub QQLogin login = new QQLogin(); login.init(); } public void init() { // 设置窗体大小 this.setSize(new Dimension(385, 300)); // 设置窗体为不可调整大小的状态 this.setResizable(false); // 设置窗体的布局 this.setLayout(new BorderLayout()); // 设置窗体的显示位置 this.setLocationRelativeTo(null); // 设置船体的标题 this.setTitle("QQ"); // 设置窗体的关闭按钮点击后的响应方式 this.setDefaultCloseOperation(3); //为了设置背景图片并且显示出来不被遮住所以不得不设置JFrame的内容窗格设置为透明 ((JPanel) this.getContentPane()).setOpaque(false); //实例化JLabel对象用于显示背景图片 ImageIcon bg = new ImageIcon("res/bg.jpg"); JLabel label = new JLabel(bg); //添加背景图片标签 this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE)); //设置背景标签的位置 label.setBounds(0, 0, 382, 275); // 调用显示北边的方法,用于初始化北边要显示的组件 createNorth(); // 调用显示南边的方法,用于初始化北边要显示的组件 createSouth(); // 调用显示西边的方法,用于初始化北边要显示的组件 createWest(); // 调用显示中间的方法,用于初始化北边要显示的组件 createCenter(); // 设置窗体为可见状态 this.setVisible(true); } // 定义初始化北边的方法,对北边的组件初始化 private void createNorth() { //添加这个标签不让中间的组件跑到最上面来 JLabel label = new JLabel(); label.setPreferredSize(new Dimension(378, 120)); label.setOpaque(false); this.add(label, BorderLayout.NORTH); } // 定义初始化南边的方法,对南边的组件初始化 private void createSouth() { JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER)); panel.setOpaque(false); // 添加多账号登陆图片 ImageIcon icon = new ImageIcon("res/a.jpg"); JLabel labelM = new JLabel(icon); panel.add(labelM); //因为使用的是流式布局所以添加的组件必定会挨在一起所以添加这个以达到不让组件挨着的目的 JLabel jl1 = new JLabel(); jl1.setPreferredSize(new Dimension(65, 30)); panel.add(jl1); // 添加登陆按钮 login = new JButton("登 陆"); login.addActionListener(new ButtonListener()); login.setPreferredSize(new Dimension(156, 35)); panel.add(login); //因为使用的是流式布局所以添加的组件必定会挨在一起所以添加这个以达到不让组件挨着的目的 JLabel jl2 = new JLabel(); jl2.setPreferredSize(new Dimension(55, 30)); panel.add(jl2); // 添加二维码登陆图片 ImageIcon image = new ImageIcon("res/b.jpg"); JLabel label = new JLabel(image); panel.add(label); this.add(panel, BorderLayout.SOUTH); } // 定义初始化西边的方法,对西边的组件初始化 private void createWest() { // 实例化一个JPanel容器用于放置头像图片 JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); panel.setOpaque(false); // 实例化一个ImageIcon对象用于实例化一个JLabel对象放置头像图片 ImageIcon icon = new ImageIcon("res/head.jpg"); JLabel label = new JLabel(icon); panel.add(label); // 设置panel的大小 panel.setPreferredSize(new Dimension(100, 0)); this.add(panel, BorderLayout.WEST); } // 定义初始化中间的方法,对中间的组件初始化 private void createCenter() { // 实例化一个JPanel容器用于放置中间要显示的元素组件 JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5)); panel.setOpaque(false); // 定义JChomboBox所需的下拉列表的内容 String[] name = new String[] { "1378681713", "1238921432", "3382953294", "4853243489" }; username = new JComboBox<String>(name); // 设置用户名输入框的大小 username.setPreferredSize(new Dimension(187, 25)); // 设置JComboBox为可编辑状态 username.setEditable(true); panel.add(username); // 添加注册密码文本 JLabel labelReg = new JLabel("注册账号"); //设置文字的颜色 labelReg.setForeground(Color.BLUE); panel.add(labelReg); // 添加密码输入框 password = new JPasswordField(); password.setPreferredSize(new Dimension(187, 25)); panel.add(password); // 添加找回密码文本 JLabel labelFindpwd = new JLabel("找回密码"); //设置文字的颜色 labelFindpwd.setForeground(Color.BLUE); panel.add(labelFindpwd); // 添加记住密码复选框 JCheckBox remPwd = new JCheckBox("记住密码"); //设置文字的颜色 remPwd.setForeground(Color.BLUE); //设置该组件透明不让其遮住背景图片 remPwd.setOpaque(false); panel.add(remPwd); // 添加自动登陆复选框 JCheckBox autoLogin = new JCheckBox("自动登陆"); //设置文字的颜色 autoLogin.setForeground(Color.BLUE); //设置该组件透明不让其遮住背景图片 autoLogin.setOpaque(false); panel.add(autoLogin); this.add(panel, BorderLayout.CENTER); } private class ButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub String name = (String) username.getSelectedItem(); String pwd = new String(password.getPassword()); if(pwd.equals("admin") && name.equals("admin")) { JOptionPane.showMessageDialog(null, "登陆成功"); } else { JOptionPane.showMessageDialog(null, "账号或者密码错误"); } } } }