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. [BSidesCF 2020]Had a bad day 1--PHP伪协议

    首先先打开主页,审查代码,并没有什么特别的地方使用dirsearch,发现flag.php![在这里插入图片描述](https://img-blog.csdnimg.cn/82348deddfd94c ...

  2. like %和-的区别与使用

    通配符的分类: %百分号通配符:表示任何字符出现任意次数(可以是0次). 下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符. like操作符: LIKE作用是指示mysql后面的搜索模 ...

  3. spring第三章

    第三章 实现AOP AOP:面向方面编程,AOP能够使您将所有模块共有的特性与应用程序的主要业务逻辑隔离开 一.AOP介绍 横切关注点:在Web应用程序中,有一些服务(如登录.安全和事务管理)不是应用 ...

  4. 自制车速记录仪「GitHub 热点速览 v.21.31」

    作者:HelloGitHub-小鱼干 如果你有一辆普通的自行车,那么就可以使用下 X-TRACK 这个项目制作一个自己的测速器,记录你的行驶轨迹还有车速,体验一把硬件发烧友的乐趣.如果你有一个非 ma ...

  5. Mysql读写锁保姆级图文教程

    摘要:读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞. 本文分享自华为云社区<Mysql保姆级读写锁图文教程丨[绽放吧!数据库]>,作者:Code皮皮虾 . 准备 创建mylock表 ...

  6. Python爬虫+可视化教学:爬取分析宠物猫咪交易数据

    前言 各位,七夕快到了,想好要送什么礼物了吗? 昨天有朋友私信我,问我能用Python分析下网上小猫咪的数据,是想要送一只给女朋友,当做礼物. Python从零基础入门到实战系统教程.源码.视频 网上 ...

  7. JIPB | 两篇连发:华中农大黄俊斌团队报道二羟基异丁酰化调控稻曲病菌致病新机制

    水稻是我国重要的粮食作物,稻曲病是水稻三大病害之一,不仅造成稻米产量损失,更重要的是稻曲球中的稻曲菌素的毒性和致畸作用,给人畜健康带来严重威胁.病原菌对植物的侵袭是由病原菌的毒力和植物免疫系统相互作用 ...

  8. [CISCN2019 华北赛区 Day2 Web1]Hack World(二分法写布尔注入脚本)

    记一道布尔注入的题,存在过滤字符. 从题目看应该是一道注入题.提示存在flag表flag列. 输入1和2的返回结果不一样,可能是布尔注入. 简单用万能密码尝试了一下.提示SQL Injection C ...

  9. 用 getchar putchar 来输入和接收 但是要清空缓冲区

    1 //用 getchar putchar 来输入和接收 但是要清空缓冲区 2 3 #include <stdio.h> 4 int main() 5 { 6 char ch1,ch2; ...

  10. 心酸!30岁深漂失业3个月,从巅峰跌落谷底,大龄Android开发必须要懂的事!

    2021年3月,我的前同事,在我们群里说他准备回老家了,问我们有没有人可以暂时收养他的猫. --他说,这周末就要离开深圳了. 他失业了.3个多月没收入,还要交着房租,过年来之后找了快一个月的工作也没有 ...