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. 解决远程连接服务器数据库报错:Host ‘XXXXXX’ is blocked because of many connection errors

    参考:https://blog.csdn.net/li_li_lin/article/details/72764683和 https://blog.csdn.net/zaishijizhidian/a ...

  2. 在HTML中使用JavaScript(浏览器对js的加载机制分析)

    前言: 向HTML页面中插入JavaScrip的主要方法,就是使用<script>标签.主要探讨<script>标签的在HTML页面的渲染机制.对应的业务场景:从js的加载机制 ...

  3. cisco 交换机 IOS命令

    1 显示交换机的MAC地址表 user mode : show mac-address-table

  4. Android系统编程入门系列之界面Activity响应丝滑的传统动画

    上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化.然而不管是启动一个界面执行新界 ...

  5. 在Linux下安装node及npm

    1.解压 # tar Jxf node-v12.18.3-linux-x64.tar.xz 2.移动到指定目录 # mv node-v12.18.3-linux-x64  /usr/local/nod ...

  6. 关于intouch/ifix嵌入视频控件并使用(海康,大华)

    2017年下半年项目开始接触利用intouch工控软件来进行项目二次开发.其中关于驱动的问题始终是上位机的重中之重,暂且不表(嘿嘿--),首先遇到的问题就是在弹窗中嵌入视频控件,监控设备的开停状态.经 ...

  7. SpringBoot AOP中JoinPoint的用法和通知切点表达式

    前言 上一篇文章讲解了springboot aop 初步完整的使用和整合 这一篇讲解他的接口方法和类 JoinPoint和ProceedingJoinPoint对象 JoinPoint对象封装了Spr ...

  8. SaltStack 水平权限绕过漏洞(CVE-2020-11651)

    影响版本 SaltStack < 2019.2.4 SaltStack < 3000.2 poc git clone https://github.com/jasperla/CVE-202 ...

  9. 解决 Flask 项目无法用 .env 文件中解析的参数设置环境变量的错误

    在 Windows 上启动 Flask 项目时,工作目录有 UTF-8 编码的 .env 文件,里面配置的环境变量在 Python2 中识别为 Unicode 类型,导致下述错误: * Serving ...

  10. 使用html2canvas.js将HTML生成图片

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...