接口与监听器_xhsnhl的博客-程序员宅基地

技术标签: java  

从一个很简单的ui界面来写解释接与监听器

接口机制

这次不抄概念了
简单的说
java不支持多类继承 很麻烦 所以有了接口这个功能.
我定义一个接口,给接口放入一些归属于这个接口的功能.
然后在类中通过一些定义这个接口 来实现我想实现的功能
举个例子:

interface Animal {
    
   public void eat();
   public void travel();
}
public class MammalInt implements Animal{
    
 
   public void eat(){
    
      System.out.println("Mammal eats");
   }
 
   public void travel(){
    
      System.out.println("Mammal travels");
   } 
 
   public int noOfLegs(){
    
      return 0;
   }
 
   public static void main(String args[]){
    
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

第一部分是个动物类;
我们希望动物实现一些功能,定义了一个接口文件,并且写了一些方法;当我们需要时,直接执行就可。

就如下面这两段代码 第一段时接口并实现了监听功能
第二段时类的实现

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class listenner implements ActionListener {
    

	JTextField nameIn;
	JTextField secretIn;
     
	JFrame window ;
   
	// 按钮点击自动执行
	public void actionPerformed(ActionEvent e) {
    
		// 输出
		System.out.println("按钮点击了!");

		// 获取输入框的内容
		String name = nameIn.getText();
		String secret = secretIn.getText();
		// 判断
		if (name.equals("航宇") && secret.equals("123456")) {
    
			
			
			System.out.println("登录成功!");
			JOptionPane.showMessageDialog(null, "登陆成功");
			window.dispose();
			JFrame window2 = new JFrame();
			window2.setSize(300, 200);
			window2.setVisible(true);

		} else {
    

			System.out.println("登录失败!");
			//JOptionPane.showMessageDialog(null, "登陆失败");

		}

	}

}
import javax.swing.JComboBox;
import javax.swing.JFrame;
import java.awt.FlowLayout;
import javax.swing.JTextField;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.JOptionPane;

public class loginUI {
    
	public void showUI() {
    
		JFrame loginFrame = new JFrame();
		loginFrame.setSize(500, 360);
		// JFrame window = new JFrame();
		// window.setSize(300,360);
		FlowLayout flowLayout = new FlowLayout();
		loginFrame.setLayout(flowLayout);
		ImageIcon icon = new ImageIcon("C:\\Users\\Administrator\\Desktop\\1592995429(1).png");
		JLabel iconLabel = new JLabel(icon);
		loginFrame.add(iconLabel);
		JTextField nameInput = new JTextField();
		Dimension inputSize = new Dimension(400, 35);
		nameInput.setPreferredSize(inputSize);
		loginFrame.add(nameInput);

		JLabel registerLabel = new JLabel("注册账号");
		loginFrame.add(registerLabel);

		JTextField passwordInput = new JTextField();

		Dimension passwordSize = new Dimension(400, 35);
		passwordInput.setPreferredSize(passwordSize);

		loginFrame.add(passwordInput);

		JLabel registerPassword = new JLabel("找回密码");

		loginFrame.add(registerPassword);

		JButton btn = new JButton("  登录     ");
		// btn.setBackground();
		Dimension preferredSize = new Dimension(250, 35);
		btn.setPreferredSize(preferredSize);
		btn.setVerticalAlignment(SwingConstants.BOTTOM);
		loginFrame.add(btn);

		// 创建监听器对象

		listenner loginL = new listenner(); // 给按钮添加监听器
		btn.addActionListener(loginL); // 让监听器的输入框等于界面的输入框 loginL.nameIn = nameInput;
		loginL.secretIn = passwordInput;
		loginL.nameIn = nameInput;
		loginL.window = loginFrame;
		loginFrame.setVisible(true);
        
		/*
		 * if ("航宇".equals(nameInput.getText()) &&
		 * "123456".equals(passwordInput.getText())) {
		 * 
		 * JOptionPane.showMessageDialog(null, "登陆成功"); loginFrame.dispose();
		 * 
		 * }
		 */

	}

	public void switchui() {
    
		JFrame window = new JFrame();
		window.setSize(300, 360);

	}

	public void disframe(JFrame window1, JFrame window2) {
    

		// 关键方法 调用 dispose() 方法关闭上一个窗体
		JFrame loginFrame1 = new JFrame();
		loginFrame1.dispose();
		window2.setSize(300, 200);
		window2.setVisible(true);
	}

	public static void main(String[] args) {
    
		loginUI QQ = new loginUI();
		QQ.showUI();

	}

}

这段代码实现 loginui类中实现的是ui界面的设置
而 第一段代码写的是一个接口 需要实现行为监听器的功能
就是判断登陆是否成功

是不是觉得类的继承和接口很像
下面是两者的区别
接口与类相似点:

一个接口可以有多个方法。
接口文件保存在 .java 结尾的文件中,文件名使用接口名。
接口的字节码文件保存在 .class 结尾的文件中。
接口相应的字节码文件必须在与包名称相匹配的目录结构中。

接口与类的区别:

接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。

接口特性

接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

抽象类和接口的区别

1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

由上段代码来说一说监听器
首先:
监听器模型涉及以下三个对象,模型图如下:

(1)事件:用户对组件的一个操作,或者说程序执行某个方法,称之为一个事件,如机器人程序执行工作。
我要登陆这个界面
(2)事件源:发生事件的组件就是事件源,也就是被监听的对象,如机器人可以工作,可以跳舞,那么就可以把机器人看做是一个事件源。
登陆界面输入的内容
(3)事件监听器(处理器):监听并负责处理事件的方法,如监听机器人工作情况,在机器人工作前后做出相应的动作,或者获取机器人的状态信息。
获取这个内容,判断是否正确

监听器的划分
在这里插入图片描述监听器实现步骤

1、编写Java类实现监听器接口,并实现其接口方法。
implemets
2、在web.xml文件中对实现的监听器类进行注册。

以下为四种实现方式

package TT;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.RootPaneContainer;
/**
 *自身类作为事件监听器 :
*/
class EventListener1 extends JFrame implements ActionListener {
    
    private JButton btBlue, btDialog;

    public EventListener1() {
    
        setTitle("Java GUI 事件监听处理");
        setBounds(100, 100, 500, 350);
        setLayout(new FlowLayout());
        btBlue = new JButton("蓝色");
        btDialog = new JButton("弹窗");

        // 将按钮添加事件监听器
        btBlue.addActionListener(this);
        btDialog.addActionListener(this);

        add(btBlue);
        add(btDialog);

        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    // ***************************事件处理***************************
    @Override
    public void actionPerformed(ActionEvent e) {
    
        if (e.getSource() == btBlue) {
    
            Container c = getContentPane();
            c.setBackground(Color.BLUE);
        } else if (e.getSource() == btDialog) {
    
            JDialog dialog = new JDialog();
            dialog.setBounds(300, 200, 400, 300);
            dialog.setVisible(true);
        }
    }

}

/**
 * Java事件监听处理——内部类处理
 *
 */

class EventListener2 extends JFrame {
    
    private JButton btBlue, btDialog;

    // 构造方法
    public EventListener2() {
    
        setTitle("Java GUI 事件监听处理");
        setBounds(100, 100, 500, 350);
        setLayout(new FlowLayout());
        btBlue = new JButton("蓝色");
        btDialog = new JButton("弹窗");
        // 添加事件监听器对象(面向对象思想)
        btBlue.addActionListener(new ColorEventListener());
        btDialog.addActionListener(new DialogEventListener());

        add(btBlue);
        add(btDialog);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    // 内部类ColorEventListener,实现ActionListener接口
    class ColorEventListener implements ActionListener {
    
        @Override
        public void actionPerformed(ActionEvent e) {
    
            Container c = getContentPane();
            c.setBackground(Color.BLUE);
        }
    }

    // 内部类DialogEventListener,实现ActionListener接口
    class DialogEventListener implements ActionListener {
    
        @Override
        public void actionPerformed(ActionEvent e) {
    
            JDialog dialog = new JDialog();
            dialog.setBounds(300, 200, 400, 300);
            dialog.setVisible(true);
        }
    }

}

/**
 * Java事件监听处理——匿名内部类处理
 *
 */
class EventListener3 extends JFrame {
    
    private JButton btBlue, btDialog;

    public EventListener3() {
    
        setTitle("Java GUI 事件监听处理");
        setBounds(100, 100, 500, 350);
        setLayout(new FlowLayout());

        btBlue = new JButton("蓝色");
        btDialog = new JButton("弹窗");

        // 添加事件监听器(此处即为匿名类)
        btBlue.addActionListener(new ActionListener() {
    
            // 事件处理
            @Override
            public void actionPerformed(ActionEvent e) {
    
                Container c = getContentPane();
                c.setBackground(Color.BLUE);
            }
        });

        // 并添加事件监听器
        btDialog.addActionListener(new ActionListener() {
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
                JDialog dialog = new JDialog();
                dialog.setBounds(300, 200, 400, 300);
                dialog.setVisible(true);
            }
        });

        add(btBlue);
        add(btDialog);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

/**
 * Java事件监听处理——外部类处理
 *
 */
class EventListener4 extends JFrame {
    
    private JButton btBlue, btDialog;

    public EventListener4() {
    
        setTitle("Java GUI 事件监听处理");
        setBounds(100, 100, 500, 350);
        setLayout(new FlowLayout());
        btBlue = new JButton("蓝色");
        btDialog = new JButton("弹窗");
        // 将按钮添加事件监听器
        btBlue.addActionListener(new ColorEventListener(this));
        btDialog.addActionListener(new DialogEventListener());

        add(btBlue);
        add(btDialog);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

// 外部类ColorEventListener,实现ActionListener接口
class ColorEventListener implements ActionListener {
    
    private EventListener4 el;

    ColorEventListener(EventListener4 el) {
    
        this.el = el;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    
        Container c = el.getContentPane();
        c.setBackground(Color.BLUE);
    }
}


// 外部类DialogEventListener,实现ActionListener接口
class DialogEventListener implements ActionListener {
    
    @Override
    public void actionPerformed(ActionEvent e) {
    
        JDialog dialog = new JDialog();
        dialog.setBounds(300, 200, 400, 300);
        dialog.setVisible(true);
    }
}

public class ActionListenerTest {
    
    public static void main(String args[]) {
    
        new EventListener4();
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xhsnhl/article/details/107677949

智能推荐

python 全栈开发,Day48(标准文档流,块级元素和行内元素,浮动,margin的用法,文本属性和字体属性)..._shykevin的博客-程序员宅基地

python 全栈开发,Day48(标准文档流,块级元素和行内元素,浮动,margin的用法,文本属性和字体属性) 昨日内容回顾 高级选择器:后代选择 : div p子代选择器 : div&gt...

飞速推进!上交所举行科创板发审演练,今日券商就可提交申报材料_weixin_34192732的博客-程序员宅基地

3月18日开始,科创板股票上市发行上市审核系统将正式进入生产状态, 上交所将正式受理各投行对科创板项目的申报。 日前,备受关注的科创板的准备工作正在以超预期速度在推进。昨日消息,上交所科创板上市审核中心已经下发了《关于组织科创板股票发行上市审核系统集中测试演练的通知》(以下简称“通知”)并且,3月18日之前,为试运行期,券商可以向上交所提交申报材料...

C# Winform的简易聊天程序_zheng1613的博客-程序员宅基地

基于C# Winform的简易聊天程序[第一篇-两端通信]程序简介本聊天程序支持局域网内部客户端与服务端之间的互相通信. 原理启动服务端后,服务端通过持续监听客户端发来的请求,一旦监听到客户端传来的信息后,两端便可以互发信息了.服务端需要绑定一个IP,用于客户端在网络中寻找并建立连接.信息发送原理:将手动输入字符串信息转换成机器可以识别的字节数组,然后调用套接字

32位汇编学习札记(二)_weixin_30553065的博客-程序员宅基地

win32汇编语言第二章(6.22)win32开发源码的组成win32可执行文件的源码包括两个大的部分:汇编代码和资源文件1.汇编代码:  a. asm文件:我们自己编写的汇编源码  b. windows.inc:系统api的声明文件,在我们的源代码中包含这个头文件后就可以调用windows提供的api。  c. *.inc:用户自定义头文件,我们自己编写的或者第三方函...

ElasticSearch7的基本原理和使用(借用Kibana可视化工具)_菜鸡儿的架构师之路的博客-程序员宅基地_elasticsearch7教程

Elastic SearchElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java...

联想小新air15和thinkbook15有什么区别 哪个好详细性能配置对比_妙龙的博客-程序员宅基地_联想air15与thinkbook15

联想小新air15:2021款分为锐龙版和酷睿版,其中锐龙版的日常价格行情在¥4799.00-¥5199.00之间,酷睿版的价格行情在¥5999.00 -¥6999.00之间选联想小新air15和thinkbook15 哪个好这些点很重要看过你就懂了http://www.adiannao.cn/dythinkbook15:其分为锐龙版和酷睿版,其中锐龙版的日常价格行情在¥4599.00-¥4999.00之间如果平时的用途是办公,上网,追剧,希望买一款性价比更高的笔记本,那么这款联想thinkbook1

随便推点

仿微信和QQ页面滑动效果(Fragment和ViewPager)_TaoLee-的博客-程序员宅基地

相信大家一定使用过微信,微信页面可以实现左右滑动,同时点击下面的三个按钮页面也会随之改变,相比较微信,QQ的聊天界面不能滑动,仅仅通过下面的三个按钮随之改变页面,说按钮不准确,因为那是通过一组单选按钮RadioButton实现的,首先给大家看一看布局文件 main_activity.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayou

computeshader实现全局光照_VT LI的博客-程序员宅基地

全局光照介绍全局光照技术本身是一个很复杂的技术,有非常多方式实现。从管线来说有光栅化实现的全局光照,有光线追踪实现的更逼真的行为树。而我们当前主流的或者说更多人讨论的是光栅化下的全局光照。而全局光照又包括了更多的表现,比如天气,环境等都会影响到全局光照,而每一块在引擎中可能都需要单独处理。当前流行的引擎比如unity用的光照贴图、光照探针,反射平面等方式来模拟间接光照。而ue5用的ssgi+体素+有向距离场来做的间接光照。当前也有一些...

linux下win加p键,不需其他启动管理软件在一个硬盘上同时安装win98,win2kP,win2ks,winXP,linux,FreeBSD..._weixin_39818631的博客-程序员宅基地

不需其他启动管理软件在一个硬盘上同时安装win98,win2kP,win2ks,winXP,linux,FreeBSD互联网 发布时间:2008-10-08 22:12:25 作者:佚名 我要评论作者:NetDemonemail:[email protected]://www.20cn.net/-----------------------------------------...

从本地硬盘启动计算机,戴尔笔记本电脑设置从硬盘启动的方法_歌未歌的博客-程序员宅基地

《戴尔笔记本电脑设置从硬盘启动的方法》由会员分享,可在线阅读,更多相关《戴尔笔记本电脑设置从硬盘启动的方法(1页珍藏版)》请在人人文库网上搜索。1、戴尔笔记本电脑设置从硬盘启动的方法:1. 启动计算机,并按住DEL键不放(也有按其它键的,请根据提示),直到出现BIOS设置窗口(通常为蓝色背景,黄色英文字)。2. 选择并进入第二项,“AdvancedBIOS Features (高级BIOS功能)选...

基于 SOFAArk 和 SOFADashboard 实现动态模块管控 | Meetup#2 回顾_SOFAStack的博客-程序员宅基地

作者:卫恒(宋国磊)SOFATracer 以及SOFADashboard 开源负责人。本文根据 5月26日 SOFA Meetup#2上海站 《使用 SOFAStac...

增长工程师修炼之道_weixin_30663391的博客-程序员宅基地

前言我的成长四步曲在我成长初期,我制定了一些计划来实现下面的一些能力:能做到你想做的: Tasking与学习能力用更好的方法来实现功能Better Code &amp; Architecture运营(Growth Hacker)除了第一步,每一个步骤都花费了相当长的时间来学习,光在学习方面就差不多一年了。能做到你想做的: Tasking与学习能力虽然这看...

推荐文章

热门文章

相关标签