今天来聊一下java里面的接口,抽象类和事件监听机制。
一.接口
1.接口定义(摘自百度百科)
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没 有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口和类的区别:
我自己的理解是:接口就比如告诉你你家房子有主卧,客厅,厨房的布局(条条框框)。
实现类就是告诉你各个房间具体怎么布局的(详细实现)。
接口的作用:
1.丰富类的继承关系;
2.用于团队项目开发。
定义接口的关键字:interface
定义接口的格式:
public interface 接口名 extends 接口,... {
//定义常量(常量名Java的命名规则要求是每一个字母都要大写)
public static final 数据类型 常量名 = 值;
//定义抽象方法
public abstract 返回值类型 方法名(数据类型 参数名,...);
}
注意:
1.接口不能实例化对象(1.没有构造方法 2.方法是抽象的)。
2.所以要用类来实现接口
3.接口只有一种访问修饰符就是public。
4.接口默认提供的关键字是public、static、final、abstract。
2.类实现(继承)接口的格式
类实现(继承)接口的关键字:implements
类实现(继承)接口的格式:
public class 类名 extends 类 implements 接口,... {
}
注意:
当类实现(继承)接口后,类必须要实现(方法重写)接口中所有的抽象方法。
二.抽象类
抽象类的定义在了解抽象类之前,先来了解一下抽象方法。
抽象方法是一种特殊的方法:它只有声明,而没有具体的实现,即没有方法体。抽象方法必须用abstract关键字进行修饰。
如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
抽象类当做是接口和类的集合。
定义抽象类的关键字abstract class
public abstract class Shape {
//可以定义类所有的内容
//可以定义接口中所有的内容
}
三.事件监听机制(主要应用在图形界面上)
举个例子:
一个人有两个法律顾问,律师甲负责民事案件,律师乙负责刑事案件,当有民事案件出现时,律师甲负责帮助他处理案件,当有刑事案件出现时,律师乙负责帮助他处理案件。
事件处理过程中涉及到三类对象:
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.将事件源对象通过事件监听方法绑定事件处理类的对象。
来一个实例,目标:
在账号和密码框输入信息,点击登录按钮,信息正确显示画图界面关闭窗体,
信息错误显示错误界面,错误界面必须要依赖于登录窗体。
代码如下,几乎每个语句都有注释,很简单的,肯定可以看懂。
package yimi.login;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class LoginLinstener implements ActionListener, KeyListener {
private JTextField txtName;
private JPasswordField txtName2;
private JFrame frame ;
public LoginLinstener(JTextField txtName, JPasswordField txtName2,JFrame frame ) {
this.txtName = txtName;
this.txtName2 = txtName2;
this.frame =frame ;
}
public void actionPerformed(ActionEvent e) {
String name = txtName.getText();
String pass = txtName2.getText();
String sta="123";
// 判断是否正确
if (pass.equals(sta)) {
JFrame frame = new JFrame();
frame.setTitle("画图");
frame.setSize(700, 500);
frame.setVisible(true);
} else {
// 提示框界面,方法的第一给参数是是否指定父窗体,第二个参数是要显示的内容。
JOptionPane.showMessageDialog(frame , "输入的账号或密码错误,请重新输入!");
}
}
public void keyTyped(KeyEvent e) {
}
/**
* 敲击键盘
*/
public void keyPressed(KeyEvent e) {
}
/**
* 按下键盘
*/
public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
System.out.println(e.getKeyChar() + "————" + code);
if (!((code >= 65 && code <= 90) || (code >= 48 && code <= 57))) {
System.out.println("输入了非法字符");
}
}
}
package yimi.login;//包来管理Login类的。
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
/**
* 1.新建一个Login登录界面类
*/
public class Login {
/**
* 1.在类中定义主函数
*/
public static void main(String[] args) {
// 2.在主函数中,实例化Login类的对象
Login login = new Login();
// 3.然后使用对象名来调用初始化界面的方法。
login.initUI();
}
/**
* 4.初始化界面的方法
*/
public void initUI() {
// 5.在初始化界面的方法中,实例化JFrame窗体容器组件类的对象。
JFrame frame = new JFrame();
// 6.设置JFrmae窗体对象的属性值:标题、大小、显示位置、关闭操作、布局、可见。
frame.setTitle("Login");// 设置标题属性
frame.setSize(300, 400);// 设置窗体的大小
frame.setLocationRelativeTo(null);// 设置窗体显示在屏幕的中央。
frame.setDefaultCloseOperation(3);// 设置窗体的关闭操作为3,表示关闭窗体退出程序。
// 7.实例化FlowLayout流式布局类的对象,默认是居中对齐
FlowLayout f1 = new FlowLayout(FlowLayout.CENTER);
// 8.设置frame窗体的布局方式为fl流式布局
frame.setLayout(f1);
// 9.实例化其他组件类的对象,然后将对象添加到窗体容器组件上。
JLabel labName = new JLabel("账号:");
frame.add(labName);
JTextField txtName = new JTextField(20);
frame.add(txtName);
JLabel labName2 = new JLabel("密码:");
frame.add(labName2);
JPasswordField txtName2 = new JPasswordField(20);
frame.add(txtName2);
JButton button = new JButton("登陆");
frame.add(button);
frame.setVisible(true);// 可见
LoginLinstener lo = new LoginLinstener(txtName , txtName2,frame);// 给txtName事件源对象添加addKeyListener()监听方法,指定事件处理累的额对象为lo.
button.addActionListener(lo);
// 实例化LoginListener事件处理类的对象
txtName2.addKeyListener(lo);
txtName.addKeyListener(lo);
}
}
效果如下:
编译出登陆界面
图一
输入账号和密码,平台反馈密码
密码正确则弹出画图界面
图二
错误则弹出错误窗口,且错误窗口随登陆界面移动
图三
1.图二和图三的代码实现:
LoginListener类中的方法复写
public void actionPerformed(ActionEvent e) {
String name = txtName.getText();
String pass = txtName2.getText();
String sta="123";
// 判断密码是否正确
if (pass.equals(sta)) {
JFrame frame = new JFrame();
frame.setTitle("画图");
frame.setSize(700, 500);
frame.setVisible(true);
} else {
// 提示框界面,方法的第一给参数是是否指定父窗体,第二个参数是要显示的内容。
JOptionPane.showMessageDialog(frame , "输入的账号或密码错误,请重新输入!");
}
}
2.错误对话框随登陆界面移动的方法
JOptionPane.showMessageDialog(frame , "输入的账号或密码错误,请重新输入!");
好吧就写到这里,代码要多写多想,才熟练,我对接口,抽象类和事件监听机制的理解大概就是这样,以后有更深理解再继续更博,么么哒。