JavaBeans是一种软件组织结构,在诸如NetBeans、JBuilder或Eclipse等一些纯Java开发工具中,它能够在设计中可视化地使用机构良好的对象。这些结构良好的对象就叫做JavaBeans,简称Beans。定义Beans的类称为JavaBeans组件或Bean组件,或者简称为组建。这些类通过下列条件组织为JavaBeans组建模型:
1. Beans必须是public类。
2. 尽管Bean可能有其他构造方法,但是必须有一个公用的无参构造方法。
3. Bean必须实现接口java.io.Serializeable,并确保其持续性。
4. Bean的属性通常带有构造恰当的共用访问器方法(get 方法)和修改器方法(set 方法),可以使开发工具能够看到并使用Bean属性。
5. Bean事件可能带有构造恰当的,共用的注册方法和注销方法,使用这些方法可以添加或删除监听器。如果Bean是事件源,它必须提供注册监听器的注册方法。例如,可以使用 JButton Bean的 addActionListener 方法给 ActionEvent 事件注册一个监听器。
Bean必须满足前三个条件,因此,这三个条件称为JavanBeans组件的最低要求。是否满足后两个条件依赖于具体实现,可能编写的Bean没有 get/set 方法或者没有事件注册/注销方法。
JavaBeans组件是一种特殊的Java类。每个图形用户界面(GUI)都是一个JavaBeans组件。
Java事件模型
事件类和事件监听器接口
源组件
监听器组件
创建自定义源组件
import java.util.*;
import java.awt.event.*;
public class CourseWithActionEvent
{
private String name = "default name";
private ArrayList<String> students = new ArrayList<String>();
private int enrollmentCap = 10;
private ArrayList<ActionListener> actionListenerList;
public CourseWithActionEvent()
{
}
public CourseWithActionEvent(String name)
{
this.name = name;
}
public void addStudent(String student)
{
students.add(student);
if(students.size() > enrollmentCap)
{
// Fire ActionEvent
processEvent(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null))
}
}
public String[] getStudent()
{
return (String[])students.toArray();
}
public int getNumberOfStudents()
{
return enrollmentCap;
}
public void setEnrollmentCap(int enrollmentCap)
{
this.enrollemtnCap = enrollmentCap;
}
/** Register an action event listener */
public synchronized void addActionListener(ActionListener listener)
{
if(actionListenerList == null)
{
ationListenerList = new ArrayList<ActionListener>(2);
}
if(!actionListenerList.contains(listener))
{
actionListenerList.add(listener);
}
}
/** Remove an action event listener */
public synchronized void remvoeActionListener(ActionListener listener)
{
if(actionListenerList != null && actionListenerList.contains(listener))
{
actionListenerList.remove(listener);
}
}
/** Fire ActionEvent */
private void processEvet(ActionEvent e)
{
ArrayList list;
synchronized(this)
{
if(actionListenerList == null)
return;
list = (ArrayList)actionListener.clone();
}
for(int i = 0; i < list.size(); i++)
{
ActionListener listener = (ActionListener)list.get(i);
listener.actionPerformed(e);
}
}
}
这里源组件是按照多重监听器而设计的,我们采用java.util.ArrayList的实例actionListenerList保存源组件拥有所有的监听器。我们可以编写一个测试程序来进行测试:
import java.awt.event.*;
public class TestCourseWithActionEvent
{
CourseWithActionEvent course = new CourseWithActionEvent("Java Programing");
public TestCourseWithActionEvent()
{
course.setEnrollmentCap(2);
ActionListener listener = new Listener();
course.addActionListener(listener);
course.addStudent("John");
course.addStudent("Jim");
course.addStudent("Tim");
}
public static void main(String[] args)
{
public void actionPerformed(ActionEvent e)
{
System.out.println("Enrollment cap exceeded");
}
}
}
当然,我们还可以创建自定义事件组,这个有机会我们以后再讨论。