接着上一篇的介绍,本文重点介绍当我们向一个控件添加监听器的主要过程和相应源码解析。
本文以向一个Button按钮添加listener为例。详细介绍listener是如何存储的。
Button b = new Button(shell, SWT.CENTER);
b.setText("I am Button");
b.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
System.out.println("widgetSelected------------");
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
System.out.println("widgetDefaultSelected----------");
}
});
//Button类的addSelectionListener方法
public void addSelectionListener (SelectionListener listener) {
checkWidget ();//检查当前控件的Display对象是否为空,当前线程是否为创建该控件的线程
//如果listener为空,抛出IllegalArgumentException异常
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
//封装为SWT内部的TypedListener对象,用来区别有类型的listener和无类型的listener。
TypedListener typedListener = new TypedListener (listener);
addListener (SWT.Selection,typedListener);//Widget的addListener方法
addListener (SWT.DefaultSelection,typedListener);//Widget的addListener方法
}
//Widget的addListener方法
public void addListener (int eventType, Listener listener) {
checkWidget ();
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
_addListener (eventType, listener);
}
////Widget内部的_addListener方法,注意包访问权限,包外无法访问。
void _addListener (int eventType, Listener listener) {
if (eventTable == null) eventTable = new EventTable ();
eventTable.hook (eventType, listener);
}
//EventTable的hook方法
//EventTable使用数组存储listener类型和listener对象,GROW_SIZE为数组增量大小4
public void hook (int eventType, Listener listener) {
if (types == null) types = new int [GROW_SIZE];
if (listeners == null) listeners = new Listener [GROW_SIZE];
int length = types.length, index = length - 1;//数组最后一个元素下标
//从后向前找到数组中最后一个非空位置,那么下一个位置为空
while (index >= 0) {
if (types [index] != 0) break;
--index;
}
//找到下一个空位置放入listener
index++;
//如果数组已满,对数组进行扩充,size+4
if (index == length) {
int [] newTypes = new int [length + GROW_SIZE];
System.arraycopy (types, 0, newTypes, 0, length);
types = newTypes;
Listener [] newListeners = new Listener [length + GROW_SIZE];
System.arraycopy (listeners, 0, newListeners, 0, length);
listeners = newListeners;
}
types [index] = eventType;//将listener加入数组中
listeners [index] = listener;
}
总结:(1)对于数组的复制,建议使用System.arraycopy,当然二维数组的复制一定要小心,二维数组复制的是内部数组的引用。
一个详细讲解System.arraycopy的文章:
http://xiaooman07.iteye.com/blog/451843
(2)SWT抛出异常的机制是通过错误代码(error code)找到对应的message字符串,将message封装为exception并抛出。
分享到:
相关推荐
Java触发事件应用实例是Java编程中的重要组成部分,主要用于构建用户交互性强的应用程序。在Java中,事件处理主要是通过事件监听器、事件源和事件对象来实现的。本篇将深入探讨Java事件处理机制,以及如何在实际应用...
本实例将深入探讨Java事件处理机制,特别是按钮的单击事件。在Java Swing或JavaFX库中,我们可以创建按钮并定义其单击行为。以下是关于这个主题的详细讲解。 首先,我们需要导入必要的Java Swing库,如`javax.swing...
下面我们将深入探讨这些组件以及相关的事件监听器适配器。 首先,事件源是产生事件的对象,通常是UI组件,如按钮、文本框等。当用户与这些组件交互时,事件源会生成相应的事件。例如,当用户点击一个按钮时,按钮...
本指南将深入探讨Java事件处理的原理、机制以及相关实践。 首先,Java事件处理基于Observer模式,即观察者模式。在这种模式下,事件源(通常是GUI组件,如按钮、文本框等)是被观察的对象,当它们的状态发生改变时...
在这个特定的主题中,我们关注的是"Java事件",特别是"鼠标事件",并通过实例代码来深入理解这一概念。 Java事件模型基于观察者模式,其中事件源(通常是组件如按钮或文本框)生成事件,而事件监听器则注册以接收...
- **事件处理流程**:在Java2事件模型中,事件处理涉及`deliverEvent()`方法确定事件的目标组件,然后调用`postEvent()`方法将事件传递给目标组件的事件处理器。如果处理器处理了事件,它会返回`true`,否则事件会...
本篇将深入探讨Java中的键盘事件,并提供一个名为`KeyEventDemo1.java`的实例代码。 首先,我们要理解Java AWT(Abstract Window Toolkit)和Swing库是如何处理键盘事件的。这两个库提供了图形用户界面组件,如按钮...
本编程范例主要聚焦于Java的事件监听器和事件适配器机制,以及如何在J2EE(Java 2 Platform, Enterprise Edition)环境中实现这些概念。 首先,我们要理解Java事件模型。Java事件模型基于发布/订阅模式,其中事件源...
本示例"java事件处理机制Demo"将深入探讨Java的观察者模式(Observer Pattern)及其在实际项目中的应用。 首先,我们来理解什么是观察者模式。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当...
### 深入浅出学习Java事件处理 #### 一、Java事件处理概述 Java图形用户界面(GUI)的设计依赖于强大的事件处理机制来响应用户的输入操作和其他动态变化。事件处理是实现用户与程序交互的核心技术之一。在Java中,...
而事件处理程序则具体执行事件触发后的逻辑。 #### 2. 生活中的事件驱动模型示例 想象一下,你在街头行走时不幸被高空坠落的花瓶砸中,随后失去意识。这一系列事件其实遵循着事件驱动模型的框架: 1. **事件源**...
### JAVA基础:深入浅析Java语言的事件处理 #### 一、引言 在Java程序设计中,事件处理是一项非常核心的技术。无论是图形用户界面(GUI)应用还是服务器端的应用开发,事件处理机制都是构建交互式应用程序的基础。...
Java事件模型主要基于观察者模式,其中事件源(通常是组件,如按钮、文本框等)是被观察的对象,而事件监听器则是观察者,负责处理由事件源触发的事件。Java AWT和Swing库提供了丰富的组件和事件类来支持这一机制。 ...
在Java编程语言中,事件监听是构建用户界面(UI)应用程序的一个关键概念。...Java自定义事件监听允许开发者创建自己的事件类型并相应...对于希望深入理解Java GUI编程的开发者来说,掌握自定义事件监听是必不可少的技能。
Java事件机制是Java编程中一个重要的概念,它主要用于处理用户界面(UI)的交互操作,如按钮点击、窗口改变等事件。在这个过程中,事件、事件源和事件监听器是核心概念。下面将详细阐述这些概念及其在实际开发中的...
在这个实例中,我们将深入探讨Java中的事件单击事件,特别是关于"LookAndFeelDemo.java"文件的代码。 Java AWT(Abstract Window Toolkit)和Swing库都包含了处理事件的机制。在Swing中,事件通常通过监听器...
在Java开发领域,事件驱动模型(Event-Driven Model)是一种广泛采用的设计模式,它通过响应外部事件来触发程序中的特定行为。本文将深入探讨Java中事件驱动模型的应用,特别是通过Swing框架的具体实例来解析这一...
本篇文章将深入探讨Java中JComboBox的事件处理机制,以及如何通过编程实现这些功能。 JComboBox的事件主要分为两类:ActionEvent和ItemEvent。ActionEvent通常发生在用户从下拉列表中选择一个选项并点击确认按钮...
本篇文章将深入探讨如何在Java中实现鼠标事件监听,包括点击、移动和释放等行为,并通过一个简单的例子来说明。 首先,我们需要了解Java AWT(Abstract Window Toolkit)和Swing库提供的鼠标事件类和监听器接口。...