JAVA继承的拓展——接口和事件机制

本文介绍了Java中的接口概念及其重要性,特别是在实现多继承方面的应用。同时,详细讲解了事件监听机制,包括常用的监听器接口及其实现过程,通过一个登录界面的例子展示了事件处理的具体步骤。

JAVA继承的拓展——接口和事件机制

为了实现代码的重用性和程序的扩展性,JAVA引用了类的继承这一方法,但是它存在着只能单个类之间继承的缺陷,为了弥补这一缺陷,这里引入了接口这一概念。

接口的定义

java的接口是一系列方法的声明,是一些方法特征的集合。它的关键字是interface,定义接口的方法是:

public interface 接口名 extends 接口名,...{

//定义常量,常量名最好全部大写
public static final 常量名 = 值;

//定义抽象方法

public abstract 返回值类型  方法名();
这里需要注意的是
1,接口只有一个访问修饰符public;
2,接口默认提供public,static,final,abstract关键字
3,接口可以继承一个或多个接口
4,接口不能实例化对象


接口的实现

实现接口的关键字是implements,格式为:

public class 类名 implements 接口,...{

//类必须要重写接口中的所有方法(接口若继承父接口,也会包含父接口中的所有方法)

}

同样,接口的实现也有需要注意的方面:
1,类可以继承类之后再继承接口
2,接口实际上是丰富类的继承方法
3,类继承接口后,类必须要重写接口中的所有抽象方法
4,类实现接口后,实际上就是类继承了接口

接口和类最大的区别便是接口可以继承多个接口,这极大的弥补了类只能继承单个类的不足,更大功效得提高了程序的运行效率。

事件机制

现实生活中一个事件的发生往往需要一个起因,这个起因来自于一个动作的产生,同样java中的事件源便是发生某一动作的组件。在一个程序中若想知道哪个组件是事件源,要如何来实现呢?这里便需要java中的事件监听方法,如下列举出四个监听方法:

addActionListener(ActionListener l);
该监听方法会监听事件源上是否有鼠标点击(类似于按钮组件)或者键盘回车动作(类似于输入框)发生,如果有则交给ActionListener类型的参数对象l进行处理,对象l会自动调用相应的方法,执行方法中的代码。

addMouseListener(MouseListener l);
该监听方法会监听事件源上是否有鼠标进入、离开、按下、释放、单击动作发生,如果有则交给MouseListener类型的参数对象l进行处理,对象l会自动调用相应的方法,执行方法中的代码。

addMouseMotionListener(MouseMotionListener l);
该监听方法会监听事件源上是否有鼠标移动或拖动动作发生,如果有则交给MouseMotionListener类型的参数对象l进行处理,对象l会自动调用相应的方法,执行方法中的代码。

addKeyListener(KeyListener l);
该监听方法会监听事件源上是否有键盘按键按下、

其对应的事件接口分别为:
ActionListener 动作事件接口
MouseListener 鼠标事件接口
MouseMotionListener鼠标移动事件接口
KeyListener 键盘事件接口

那么,事件的发生为什么要用到接口呢?我们以login界面为例:
点击登录按钮,就要出现一个新的界面。

这里事件源对象是登录按钮,事件是出现一个新的界面,这里便要对登录按钮进行监听,以判断是否有点击这个动作的发生,所以要引用addActionListener监听方法,因此便要引用ActionListener事件接口,如此便可实现由点击到弹出新界面的一系列事件的发生。

概括起来便是:当你给事件源对象添加监听方法,指定事件接口的对象后,这时如果在事件源对象上发生对应的动作,那么事件监听方法就会捕获到动作,将动作交给事件接口对象,事件接口对象就会根据动作自动调用对应的事件处理方法,执行方法中的代码。

登录功能的实现

简单的登录功能便是从一个界面点击登录按钮后到达另一个界面,其中需要用到
1,事件源,也就是登陆按钮
2,事件监听方法,这里我们用到的事addActionListener(ActionListener 1)事件处理
3,事件接口,需要定义一个事件处理类ActionListener事件处理类
之后我们便可以开始分步骤实现功能了:
1,首先定义一个LoginListener类,该类实现ActionListener接口,并要求重写接口中的抽象方法
我们的要求是出现一个新的界面,所以该接口中方法的重写需要定义一个新的点击登录之后出现的界面
package xxj.interface0512;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

//import引入类到当前类中使用,之后就可以直接使用类名了,不需要再加包名了。
//引入类的快捷键是:Ctrl+Shift+O
/**
  * 1.新建一个LoginListener类,该类实现ActionListener接口
 */
public class LoginListener implements ActionListener {


/**
* 1.重写实现接口中的抽象方法。
* 该方法就是我们的事件处理方法
*/
    public void actionPerformed(ActionEvent e){
    //2.实现一个新界面的代码。
    JFrame df = new JFrame();
    df.setTitle("Drawing Frame");
    df.setSize(300, 400);
    df.setDefaultCloseOperation(2);
    df.setLocationRelativeTo(null);
    df.setLayout(new FlowLayout());
    df.setVisible(true);
    }
}
2,定义一个Login类,定义初始窗口界面,在该类中实例化LoginListener事件处理类的对象11
3,给butLogin事件源对象添加addActionListener()监听方法,指定事件接口对象是ll
package xxj.interface0512;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Login extends JFrame {
public static void main(String[] args) {
Login l = new Login();
l.initUI();
}

//初始化界面的方法
public void initUI(){
this.setTitle("Login");
this.setSize(300, 400);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setLayout(new FlowLayout());

JLabel labelName = new JLabel("账号:");
this.add(labelName);

JTextField textName = new JTextField();
textName.setPreferredSize(new Dimension(200,30));//设置组件大小
this.add(textName);

JButton butLogin = new JButton("登录");
this.add(butLogin);

this.setVisible(true);

//3.实例化LoginListener事件处理类的对象
LoginListener ll = new LoginListener();

//4.给butLogin事件源对象添加addActionListener()监听方法,指定事件接口对象是ll
butLogin.addActionListener(ll);

}
}

整个事件执行的流程如下:
当你给事件源对象添加监听方法,指定事件接口的对象后,这时如果在事件源对象上发生对应的动作,那么事件监听方法就会捕获到动作,将动作交给事件接口对象,事件接口对象就会根据动作自动调用对应的事件处理方法,执行方法中的代码。

如此,便实现了简单的登录功能。

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Text extends JFrame implements ActionListener,TextListener { private JLabel username,password,email,telephone; private JTextField usernameField,emailField; private TextField teleField; private JPasswordField passwordField; private JButton registButton,cancelButton; public Text() { super("用户注册"); Container container = getContentPane(); container.setLayout(new FlowLayout()); username = new JLabel("用户名"); username.setToolTipText("请输入用户名"); password = new JLabel("密 码"); password.setToolTipText("密码不能少于6位"); email = new JLabel("邮 箱"); email.setToolTipText("邮箱中必须包含@字符"); telephone = new JLabel("电 话"); telephone.setToolTipText("电话只能为数字"); usernameField = new JTextField(15); usernameField.addActionListener(this); passwordField = new JPasswordField(15); passwordField.addActionListener(this); emailField = new JTextField(15); emailField.addActionListener(this); teleField = new TextField(21); teleField.addActionListener(this); teleField.addTextListener(this); registButton = new JButton("注册"); cancelButton = new JButton("取消"); container.add(username); container.add(usernameField); container.add(password); container.add(passwordField); container.add(email); container.add(emailField); container.add(telephone); container.add(teleField); container.add(registButton); container.add(cancelButton); registButton.addActionListener(this); cancelButton.addActionListener(this); setSize(250,200); setVisible(true); setResizable(false); } public void textValueChanged(TextEvent event) { if (event.getSource() == teleField) { /*if (!checkNumber(teleField.getText())) { JOptionPane.showMessageDialog(this,"电话必须为数字","温馨提示",JOptionPane.INFORMATION_MESSAGE); teleField.setText(""); } */ } } public void actionPerformed(ActionEvent event) { if (event.getSource() == usernameField) { if (usernameField.getText().equals("")) { JOptionPane.showMessageDialog(null,"用户名不能为空","温馨提示",JOptionPane.INFORMATION_MESSAGE); } } if (event.getSource() == passwordField) { if (passwordField.getPassword().length == 0) { JOptionPane.showMessageDialog(this,"密码不能为空","温馨提示",JOptionPane.INFORMATION_MESSAGE); } else if (passwordField.getPassword().length < 6) { JOptionPane.showMessageDialog(this,"密码长度不能小于6位","温馨提示",JOptionPane.INFORMATION_MESSAGE); passwordField.setText(""); } } if (event.getSource() == emailField) { if (emailField.getText().indexOf("@") = (emailField.getText().length() - 1) || emailField.getText().equals("")) { JOptionPane.showMessageDialog(this,"您的邮箱格式不正确","温馨提示",JOptionPane.INFORMATION_MESSAGE); emailField.setText(""); } } if (event.getSource() == teleField) { if (teleField.getText().equals("")) { JOptionPane.showMessageDialog(this,"联系电话不能为空","温馨提示",JOptionPane.INFORMATION_MESSAGE); } else if (!checkNumber(teleField.getText())) { JOptionPane.showMessageDialog(this,"电话必须为数字","温馨提示",JOptionPane.INFORMATION_MESSAGE); teleField.setText(""); } } if (event.getSource() == registButton) { if (usernameField.getText().equals("") || passwordField.getPassword().length == 0 || emailField.getText().equals("") || teleField.getText().equals("")) { JOptionPane.showMessageDialog(this, "您填写的信息不完整","温馨提示",JOptionPane.INFORMATION_MESSAGE); usernameField.setText(""); passwordField.setText(""); emailField.setText(""); teleField.setText(""); } else if (passwordField.getPassword().length < 6) { JOptionPane.showMessageDialog(this,"密码长度不能小于6位","温馨提示",JOptionPane.INFORMATION_MESSAGE); passwordField.setText(""); } else if (emailField.getText().indexOf("@") = (emailField.getText().length() - 1)) { JOptionPane.showMessageDialog(this,"您的邮箱格式不正确","温馨提示",JOptionPane.INFORMATION_MESSAGE); emailField.setText(""); } else if (!checkNumber(teleField.getText())) { JOptionPane.showMessageDialog(this,"电话必须为数字","温馨提示",JOptionPane.INFORMATION_MESSAGE); teleField.setText(""); } else JOptionPane.showMessageDialog(this,"恭喜您,注册成功","温馨提示",JOptionPane.INFORMATION_MESSAGE); } if (event.getSource() == cancelButton) { usernameField.setText(""); passwordField.setText(""); emailField.setText(""); teleField.setText(""); } } public boolean checkNumber(String str) { for (int i=0;i<str.length();i++) { return false; } return true; } public static void main(String args[]) { Text application = new Text(); application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值