介绍完类的继承后,今天要给大家介绍一下接口、抽象类及事件监听。
1.接口
接口丰富了类的继承关系,同时在团队项目开发的时候,对项目框架的搭建有着重要意义,下面就给大家详细介绍接口
1.接口的定义
定义接口的关键字:interface
定义接口的格式:
public interface 接口名 {
//定义常量(常量名Java的命名规则要求是每一个字母都要大写)
public static final 数据类型 常量名 = 值;
//定义抽象方法
public abstract 返回值类型 方法名(数据类型 参数名,...);
}
注意:
1.接口不能实例化对象,因为它没有构造方法,并且方法是抽象的。
2.接口只有一种访问修饰符就是public。
3.接口默认提供的关键字是public、static、final、abstract。
4.接口也能够去继承,但只能继承接口,不能继承类。
2.类实现(继承)接口的格式
类实现(继承)接口的关键字:implements
类实现(继承)接口的格式:
public class 类名 implements 接口,... {
}
注意:
1.当类同时要继承类及实现接口时,必须先继承,后实现。
public class 类名 extends 类名 implements 接口,... {
}
2.当类实现(继承)接口后,类必须要实现(方法重写)接口中所有的抽象方法。
。
2.抽象类
介绍完接口,现在为大家介绍一个介于接口与类中间的定义——抽象类
抽象类的定义
定义抽象的关键字abstract class
public abstract class Shape {
//可以定义类所有的内容
//可以定义接口中所有的内容
}
通过定义,我们可以把抽象类当做是接口和类的集合,所以它可以有实现的,也可以有未实现的方法,而抽象类不能实例化对象。在使用抽象类时,对于父类中有方法体的方法,子类可以直接继承使用,如果父类中的方法是没有方法体的,则子类就必须要重写。
3.事件监听机制(主要应用在图形界面上)
1.事件源对象:接收动作的组件对象
有哪些可以成为事件源对象? 所有的容器组件和元素组件
界面上会有很多的组件,那么如何确定谁是事件源对象?
根据你的动作来决定,你的动作发生在哪一个组件上,那么该组件就是事件源对象。
2.事件监听方法:监听事件源对象上是否有动作发生。
以下是几个常用的事件监听方法
addActionListener(ActionListener l);
监听类似按钮组件上是否有鼠标点击动作的方法或者是监听类似输入框组件上是否
有键盘的回车动作的方法,如果有,则捕获动作以及相关的信息,交给
ActionLIstener参数对象进行处理。
addKeyListener(KeyListener l);
监听事件源对象上是否有键盘按键按下,释放和敲击动作,如果有则
捕获动作以及相关的信息,交给KeyListener参数对象进行处理。
addMouseListener(MouseListener l);
监听事件源对象上是否有鼠标的进入、按下、释放、点击和离开动作,如果有则
捕获动作以及相关的信息,交给MouseListener参数对象进行处理。
addMouseMotionListener(MouseMotionListener l);
监听事件源对象上是否有鼠标的移动和拖动动作,如果有则
捕获动作以及相关的信息,交给MouseMotionListener参数对象进行处理。
addFocusListener(FocusListener l);
监听事件源对象上是否有组件获得或失去键盘焦点动作,如果有则
捕获动作以及相关的信息,交给FocusListener参数对象进行处理。
addChangeListener(ChangeListener l);
addPopupMenuListener(PopupMenuListener l);
3.事件接口(事件处理类):事件监听方法就会将动作交给事件处理类来来处理
ActionListener处理按钮的点击动作和输入框的回车动作
KeyListener处理键盘按键按下,释放和敲击动作
MouseListener处理鼠标按下、释放、点击、进入和离开动作
MouseMotionListener处理鼠标移动和拖动动作
FocusListener处理获取焦点和失去焦点的动作
ChangeListener处理组件状态改变的动作
PopupMenuListener处理弹出菜单可见、不可见、取消的动作
一般要完成一个事件监听,可根据以下步骤实现:
1.找出事件源对象;
2.确定事件监听方法;
3.编写事件处理类;
4.将事件源对象通过事件监听方法绑定事件处理类的对象。
如:要实现在账号和密码框输入信息,点击登录按钮,信息正确显示画图界面,信息错误显示错误界面。
1.找出事件源对象:登录按钮
2.确定事件监听方法:addActionListener(ActionListener l);
3.编写事件处理类:定义类实现ActionListener,重写方法
4.将事件源对象通过事件监听方法绑定事件处理类的对象。
代码如下:
//引入类有一个快捷键:Ctrl+Shift+Opublic class Login
public static void main(String[] args) {
// 在主函数中,实例化Login类的对象Login login = new Login();
// 然后使用对象名来调用初始化界面的方法。login.initUI();
}
//初始化界面的方法public void initUI() {
//在初始化界面的方法中,实例化JFrame窗体容器组件类的对象。JFrame frame = new JFrame();
// 设置JFrmae窗体对象的属性值:标题、大小、显示位置、关闭操作、布局、可见。frame.setTitle("Login");// 设置标题属性frame.setSize(300, 400);// 设置窗体的大小frame.setLocationRelativeTo(null);// 设置窗体显示在屏幕的中央。frame.setDefaultCloseOperation(3);// 设置窗体的关闭操作为3,表示关闭窗体退出程序。
// 实例化FlowLayout流式布局类的对象,默认是居中对齐FlowLayout fl = new FlowLayout(FlowLayout.CENTER);
// 设置frame窗体的布局方式为fl流式布局frame.setLayout(fl);
// 实例化其他组件类的对象,然后将对象添加到窗体容器组件上。JLabel labName = new JLabel("账号:");// 实例化JLabel类的对象,设置要显示的信息为"账号:"frame.add(labName);// 让后将labName组件添加到frame对象上
JTextField txtName = new JTextField(20);// 实例化JTextField文本输入框类的对象frame.add(txtName);// 将txtName添加到窗体容器组件上
//实例化其他组件类的对象,然后将对象添加到窗体容器组件上。JLabel labPass = new JLabel("密码:");// 实例化JLabel类的对象,设置要显示的信息为"密码:"frame.add(labPass);// 让后将labPass组件添加到frame对象上
JPasswordField txtPass = new JPasswordField(20);// 实例化JPasswordField密码输入框类的对象frame.add(txtPass);// 将txtPass添加到窗体容器组件上
JButton butLogin = new JButton("登录");
frame.add(butLogin);
frame.setVisible(true);// 设置窗体为可见
// 实例化LoginListener事件处理类的对象LoginListener ll = new LoginListener(txtName, txtPass);
// 给txtName事件源对象添加addKeyListener()监听方法,指定事件处理累的额对象为ll.txtName.addKeyListener(ll);
butLogin.addActionListener(ll);
}
}
public class LoginListener implements KeyListener, ActionListener {
private JTextField txtName;
private JPasswordField txtPass;
/*** 构造方法** @param txtName从Login界面类传递过来的账号输入框* @param txtPass从Login界面类传递过来的密码输入框*/
public LoginListener(JTextField txtName, JPasswordField txtPass) {
this.txtName = txtName;
this.txtPass = txtPass;
}
/*** 当你在事件源对象上发生按键的敲击动作时执行此方法。*/
public void keyTyped(KeyEvent e) {
}
/*** 当你在事件源对象上发生鼠标点击动作或者是键盘回车键的动作时执行此方法。*/
public void actionPerformed(ActionEvent e) {
// 获取账号和密码输入框中的数据String name = txtName.getText();
String pass = txtPass.getText();
// 判断是否正确if (name.equals(pass)) {
JFrame frame = new JFrame();
frame.setTitle("画图");
frame.setSize(700, 500);
frame.setVisible(true);
} else {
// 提示框界面,方法的第一给参数是是否指定父窗体,第二个参数是要显示的内容。JOptionPane.showMessageDialog(null, "输入的账号或密码错误,请重新输入!");
}
}
/*** 当你在事件源对象上发生按键的按下动作时执行此方法。*/
public void keyPressed(KeyEvent e) {
}
/*** 当你在事件源对象上发生按键的释放动作时执行此方法。*/
public void keyReleased(KeyEvent e) {
}
}