1 import javax.swing.*;
2 import java.awt.event.*;
3 public class TestSourceListener {
4
5 public static void main(String[] args) {
6 JFrame frame = new JFrame("TestSourceListener");
7 JButton jbt = new JButton("OK");
8
9 //Create a source object源对象
10 frame.add(jbt);
11 frame.setSize(200, 200);
12 frame.setVisible(true);
13
14 //Create listener 监听器组件
15 MyListener listener = new MyListener();
16
17 //Register listeners 注册监听器组件
18 jbt.addActionListener(listener);
19 }
20 }
21 //监听器对象
22 class MyListener implements ActionListener{
23 //ActionEvent 事件类
24 public void actionPerformed(ActionEvent e){
25 System.out.println("I will process it!");
26 }
27 }
 1 /**
2 * 创建自定义源组件
3 * 源组件必须有适当的注册与注销方法,用来添加和删除监听器。
4 * 源组件包含特定的代码,可以创建事件对象,以及通过传递这个事件对象去调用监听器的处理器。
5 */
6 import java.util.*;
7 import java.awt.event.*;
8 public class CourseWithActionEvent {
9 private String courseName = "default name";
10 private ArrayList<String> students = new ArrayList<String>();
11 private int enrollmentCap = 10;
12
13 private ArrayList<ActionListener>actionlistenerList;
14
15 private CourseWithActionEvent() {
16 }
17 public CourseWithActionEvent(String courseName){
18 this.courseName = courseName;
19 }
20 public void addStudent(String student){
21 students.add(student);
22
23 if (students.size() > enrollmentCap) {
24 //创建事件对象
25 processEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null));
26 }
27 }
28
29 public String[] getStudents(){
30 return (String[])students.toArray();
31 }
32
33 public int getNumberOfStudents(){
34 return students.size();
35 }
36
37 public int getEnrollmentCap(){
38 return enrollmentCap;
39 }
40
41 public void setEnrollmentCap(int enrollmentCap){
42 this.enrollmentCap = enrollmentCap;
43 }
44
45 public synchronized void addActionListener(ActionListener listener){
46 if(actionlistenerList == null){
47 actionlistenerList = new ArrayList<ActionListener>(2);
48 }
49 if(!actionlistenerList.contains(listener)){
50 actionlistenerList.add(listener);
51 }
52 }
53
54 public synchronized void removeActionListener(ActionListener listener) {
55 if(actionlistenerList != null && actionlistenerList.contains(listener))
56 actionlistenerList.remove(listener);
57 }
58
59 private void processEvent(ActionEvent e) {
60 ArrayList list;
61
62 synchronized (this) {
63 if(actionlistenerList == null) return;
64 list = (ArrayList)actionlistenerList.clone();
65 }
66 //通过调用每个监听器的actionPerformed方法来通知actionlistenerList中的监听器进行处理。
67 for (int i = 0; i < list.size(); i++) {
68 ActionListener listener = (ActionListener)list.get(i);
69 listener.actionPerformed(e);
70 }
71 }
72 }

Java事件模型的更多相关文章

  1. JavaScript编程:java事件模型

    3.java事件模型: 传统事件处理程序指派方法:          1.var odiv=document.getElementById("div1");             ...

  2. Java—事件和多线程机制

    一  事件 1.1 事件源 图形用户界面上每个可能产生事件的组件称为事件源. 1.2 事件监听者 Java系统中注册的用于接收特殊事件的类.不同的事件对应着不同的监听者,要想事件被监听者监听并处理,则 ...

  3. eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结

    eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...

  4. Java内存模型的历史变迁

    转自:http://www.csdn.net/article/2015-05-20/2824722-Java 摘要:本文通过介绍Java的新/旧内存模型,来展示Java技术的历史变迁. 本文通过介绍J ...

  5. java内存模型及分块

    转自:http://www.cnblogs.com/BangQ/p/4045954.html 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏   1.JMM简介   i.内存模型概述 Ja ...

  6. JVM-7.Java内存模型与高效并发

    更多内容参见<并发与同步>系列 一.引子 二.JMM 三.Java中的线程 四.线程安全 五.锁优化       一.引子 运算能力 摩尔定律:晶体管数量,代表的CPU的频率 Amdahl ...

  7. 转:【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313 happen-before规则介绍 Java语言中有一个"先行发生 ...

  8. Java内存模型与Java线程实现原理

    硬件的效率与一致性 基于高速缓存的存储交互很好的解决了处理器和内存的速度矛盾,但是也为计算机系统带来了更高的复杂度,因为引入了一个新问题:缓存一致性. 在多处理器系统中,每个处理器都有自己的高速缓存, ...

  9. Swing与AWT在事件模型处理上是一致的。

    Swing与AWT在事件模型处理上是一致的. Jframe实际上是一堆窗体的叠加. Swing比AWT更加复杂且灵活. 在JDK1.4中,给JFRAME添加Button不可用jf.add(b).而是使 ...

随机推荐

  1. SpringBoot中时间格式化的5种方法!

    在我们日常工作中,时间格式化是一件经常遇到的事儿,所以本文我们就来盘点一下 Spring Boot 中时间格式化的几种方法. ​ 时间问题演示 为了方便演示,我写了一个简单 Spring Boot 项 ...

  2. ThinkPHP3.2.3使用PHPExcel类操作excel导出excel

    如何导入excel请看:ThinkPHP3.2.3使用PHPExcel类操作excel导入读取excel // 引入PHPExcel类 import("Org.Util.PHPExccel& ...

  3. 动态 WebApi 引擎使用教程(3行代码完成动态 WebApi 构建)

    目录 什么是 WebApiEngine? 开源地址 使用方法 使用 [ApiBind] 标签让任何方法变成 WebApi 对 API 进行分类 自定义 API 名称 复制特性 为整个类配置 WebAp ...

  4. 基于Flask开发网站 -- 前端Ajax异步上传文件到后台

    大家好,我是辰哥~ 辰哥最近利用空闲时间在写一个在线可视化平台,过程中也觉得一些技术还是比较有意思的,所以就以模块化的形式分享出来.如:从网页界面(前端)上传文件到服务器(后端). 放一下该模块的界面 ...

  5. 快速设置 JAVA_HOME

    快速设置 JAVA_HOME %SystemRoot%\System32\rundll32.exe sysdm.cpl,EditEnvironmentVariables

  6. 【阿菜用工具】Slither:Solidity静态分析框架

    工具简介 Slither 是一个 python3 开发,用于检测智能合约(solidity)漏洞的静态分析框架. Slither 的 Github 地址:https://github.com/cryt ...

  7. swagger json导出word,Typora软件推荐!!!

    场景: 前几天项目验收,赶了一整天补API接口设计文档,给爷整吐了.周末的时候就想能不能直接把swagger的json文件导出成word? 顺便学习一下NPOI的使用. 实现思路: 1.先把swaag ...

  8. 自学linux——15.云主机的购买流程及域名的购买备案解析

    项目上线流程 一.服务器选配购买 项目上线的服务器必须是外网服务器 1.服务器购买情况 真实服务器(成本过高,购买内部自用) 云服务器(上线首选):阿里云,腾讯云,华为云 2.购买阿里云服务器:htt ...

  9. 那些 Unix 命令替代品们「GitHub 热点速览 v.21.32」

    作者:HelloGitHub-小鱼干 好用的 Unix 命令替代工具能让你事半功倍,例如,bat 便是个带着高亮特性的加强版 cat,就像你用了 oh my zsh 之后便会感受到它的强大.同样好用的 ...

  10. Aging Cell两篇连发 | 华中科技大学王建枝团队运用蛋白质组学技术发现具有AD早期诊断价值的血小板生物标志物

    阿尔茨海默症 (Alzheimer 's disease,AD) 是一种原发性的中枢神经系统退行性疾病.AD的主要临床症状是缓慢的认知功能减退,包括记忆.逻辑推理能力和语言功能的进行性丟失,最后发展为 ...