Java事件模型
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事件模型的更多相关文章
- JavaScript编程:java事件模型
3.java事件模型: 传统事件处理程序指派方法: 1.var odiv=document.getElementById("div1"); ...
- Java—事件和多线程机制
一 事件 1.1 事件源 图形用户界面上每个可能产生事件的组件称为事件源. 1.2 事件监听者 Java系统中注册的用于接收特殊事件的类.不同的事件对应着不同的监听者,要想事件被监听者监听并处理,则 ...
- eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结
eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...
- Java内存模型的历史变迁
转自:http://www.csdn.net/article/2015-05-20/2824722-Java 摘要:本文通过介绍Java的新/旧内存模型,来展示Java技术的历史变迁. 本文通过介绍J ...
- java内存模型及分块
转自:http://www.cnblogs.com/BangQ/p/4045954.html 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏 1.JMM简介 i.内存模型概述 Ja ...
- JVM-7.Java内存模型与高效并发
更多内容参见<并发与同步>系列 一.引子 二.JMM 三.Java中的线程 四.线程安全 五.锁优化 一.引子 运算能力 摩尔定律:晶体管数量,代表的CPU的频率 Amdahl ...
- 转:【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313 happen-before规则介绍 Java语言中有一个"先行发生 ...
- Java内存模型与Java线程实现原理
硬件的效率与一致性 基于高速缓存的存储交互很好的解决了处理器和内存的速度矛盾,但是也为计算机系统带来了更高的复杂度,因为引入了一个新问题:缓存一致性. 在多处理器系统中,每个处理器都有自己的高速缓存, ...
- Swing与AWT在事件模型处理上是一致的。
Swing与AWT在事件模型处理上是一致的. Jframe实际上是一堆窗体的叠加. Swing比AWT更加复杂且灵活. 在JDK1.4中,给JFRAME添加Button不可用jf.add(b).而是使 ...
随机推荐
- virtualbox结合nat和host-only设置固定ip的环境
需求 平时在做一些实验或学习的时候,比如rocketmq.kafaka.zookeeper等,需要在虚拟机上创建几个虚拟机组成集群来做实验:一般有两个要求: 虚拟机能访问网络,需要下载安装东西 虚拟机 ...
- 看懂UML类图笔记
在学习设计模式的时候,经常会遇到UML类图,所以就找了一些资料,做一些笔记. 从一个示例开始 下面这个类图,类之间的关系是我们需要关注的: 车的类图结构为<<abstract>> ...
- TCP协议的“三次握手”和“四次挥手”
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接.在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的.三次握手的目的是同步连接双方的 ...
- P2014选课
洛谷P2014选课 一道树形DP题. f[i][j]表示i个点选j门课程的最大学分. 递推方程: for(int a=n;a>0;a--)//总共选择多少 for(int b=0;b<a; ...
- 01_什么是BS结构,什么是CS结构?
C/S和B/S都是互联网中常见的网络结构模型. 一.什么是C/S模型? C是英文单词"Client"的首字母,即客户端的意思,C/S就是"Client/Server&qu ...
- 《深入剖析Tomcat》源码
<深入剖析Tomcat>翻译自<How Tomcat Works> 可以到官网下载:https://brainysoftware.com/download 官网下载比较慢,我就 ...
- 【阅读笔记】Java核心技术卷一 #6.Chapter8
8 泛型程序设计 8.1 为什么要使用泛型程序设计 类型参数(type parameters)(E.T.S...) 通配符类型(wildcard type)(?) 注意这两者用法用处并不同. 8.2 ...
- Docker限制
前言 Docker系列文章: 此篇是Docker系列的第十篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,马上就开始Kubernetes,加油!一起前行! 为什么要学习Docker Do ...
- Centos8 Tomcat 开机自启配置
第一步:修改catalina.sh文件 # vim 编辑 Tomcat bin/catalina.sh 文件.增加如下内容 CATALINA_PID="$CATALINA_BASE/bin/ ...
- 大数据开发-Go-新手常遇问题
真正在工作中用Go的时间不久,所以也作为新手,总结了一些常见的问题和坑 Go 中指针使用注意点 // 1.空指针反向引用不合法 package main func main() { var p *in ...