JAVABEANS程序开发从入门到精通教程精解
- 格式:pdf
- 大小:219.23 KB
- 文档页数:14
1.1跟我学Java入门到精通培训教程——第7章JavaBean编程技术及应用实例(第2部分)1.1.1JavaBean中限制属性的实现代码示例为Bean增加事件处理的功能,使其可响应用户的鼠标点击事件、焦点事件、鼠标进入退出和按下释放等事件;同时也为它提供按下与否down标识、是否获得焦点hasFocus、以及按纽的文字前景颜色foregroundColor共三个属性。
import java.awt.*;import java.io.Serializable;import java.beans.*; //为了能够使用PropertyChangeSupport类和使用VetoableChangeSupport 类import java.awt.event.*;public class JavaBeanButton extends Canvas implements Serializable {//任何实现了Serializable接口的Java类都可以成为一个JavaBean类,并且可以实现默认的序列化。
private Color backgroundColor=Color.lightGray;private String label;static final int TEXT_XPAD=12;static final int TEXT_YPAD=8;private PropertyChangeSupport changes=new PropertyChangeSupport(this);//实例化一个PropertyChangeSupport类的对象,它用于管理注册的监听器列表和属性改变事件通知的发送private VetoableChangeSupport vetos=new VetoableChangeSupport(this);//实例化一个VetoableChangeSupport类的对象,它用于管理注册的监听器列表和属性限制事件通知的发送private boolean down;private transient boolean hasFocus;private Color foregroundColor;private transient ActionListener actionListener=null;private transient MouseListener mouseListener=null;private transient FocusListener focusListener=null;public JavaBeanButton(){this("确定",true); //设置Bean的初始Label文字}public JavaBeanButton(String label,boolean down) {//设计一个带参数的构造函数以初始化Bean的Label属性super(); //通过调用基类的构造函数,以获得Canvas的一般特性bel=label;this.foregroundColor=Color.black;this.down=down;this.setFont(new Font("Dialog",Font.PLAIN,12)); //设置Bean的初始字体this.enableEvents(AWTEvent.FOCUS_EVENT_MASK| //必须设置此方法,否则Bean不能接受事件AWTEvent.MOUSE_EVENT_MASK|AWTEvent.MOUSE_MOTION_EVENT_MASK|AWTEvent.ACTION_EVENT_MASK);}public void setBackgroundColor(Color backgroundColor){this.backgroundColor=backgroundColor;repaint();}public Color getBackgroundColor(){return this.backgroundColor;}public String getLabel(){return label;}public void setLabel(String newLabel) throws PropertyVetoException{String oldLabel=label;//在属性修改的方法体内,在修改限制属性之前触发属性否决事件,并传递原始的属性值和新的属性值(要求为Object对象类型的参数)vetos.fireVetoableChange("label",oldLabel,newLabel);label=newLabel;sizeToFit();//如果目标监听器允许限制属性的值被修改,将继续触发属性被修改事件changes.firePropertyChange("label",oldLabel,newLabel);//在属性修改的方法体内,在修改完关联属性后将触发属性修改事件}//实现维护属性修改监听器列表的方法(添加和删除)public void addPropertyChangeListener(PropertyChangeListener listener) {changes.addPropertyChangeListener(listener);}public void removePropertyChangeListener(PropertyChangeListener listener) { changes.removePropertyChangeListener(listener);}//实现维护限制属性修改的监听器列表的方法(添加和删除)public void addVetoableChangeListener(VetoableChangeListener listener){vetos.addVetoableChangeListener(listener);}public void removeVetoableChangeListener(VetoableChangeListener listener){ vetos.removeVetoableChangeListener(listener);}public Dimension getPreferredSize(){FontMetrics fm=getFontMetrics(getFont());return new Dimension(fm.stringWidth(label)+TEXT_XPAD,fm.getMaxAscent()+fm.getMaxDescent()+TEXT _YPAD);}public Dimension getMinimumSize(){return this.getPreferredSize();}private void sizeToFit(){//根据Bean上的文字长度实现调整Bean的尺寸的方法Dimension d=getPreferredSize();resize(d.width,d.height);Component p=getParent();if(p !=null){p.invalidate();yout();}}public void setFont(Font f){super.setFont(f);sizeToFit();}public void setForegroundColor(Color foregroundColor) {this.foregroundColor=foregroundColor;repaint();}public Color getForegroundColor(){return this.foregroundColor;}public boolean getHasFocus(){return this.hasFocus;}public void setHasFocus(boolean hasFocus){this.hasFocus=hasFocus;repaint();}public boolean isDown(){return this.down;}public void setDown(boolean down){this.down=down;repaint();}public synchronized void paint(Graphics g) {int width=this.getSize().width;int height=this.getSize().height;g.setColor(backgroundColor);g.fillOval(0,0,width,height);g.setColor(foregroundColor);FontMetrics fm=g.getFontMetrics(); //确保文字在按钮的中央if(down){g.drawString(label,((width-fm.stringWidth(label))/2)+2,((height+fm.getMaxAscent()-fm.getMaxDescent())/2)+1);}else {g.drawString(label,(width-fm.stringWidth(label))/2,(height+fm.getMaxAscent()-fm.getMaxDescent())/2);}if(hasFocus) {g.setColor(Color.lightGray);g.drawOval(2,2,width-6,height-6);}}//实现维护鼠标点击事件的监听器列表的方法(添加和删除)public synchronized void addActionListener(ActionListener listener) { actionListener=AWTEventMulticaster.add(actionListener,listener);}public synchronized void removeActionListener(ActionListener listener){ actionListener=AWTEventMulticaster.remove(actionListener,listener);}public synchronized void addMouseListener(MouseListener listener) { mouseListener=AWTEventMulticaster.add(mouseListener,listener);}public synchronized void removeMouseListener(MouseListener listener) { mouseListener=AWTEventMulticaster.remove(mouseListener,listener);}public synchronized void addFocusListener(FocusListener listener){ focusListener=AWTEventMulticaster.add(focusListener,listener);}public synchronized void removeFocusListener(FocusListener listener){ focusListener=AWTEventMulticaster.remove(focusListener,listener);}//向所有注册ActionListener的组件分发ActionEvent事件protected void processActionEvent(ActionEvent e){if(actionListener !=null){actionListener.actionPerformed(e);}}protected void processFocusEvent(FocusEvent e){ switch(e.getID()) {case FocusEvent.FOCUS_GAINED:hasFocus=true;repaint();if(focusListener !=null){focusListener.focusGained(e);}break;case FocusEvent.FOCUS_LOST:hasFocus=false;repaint();if(focusListener !=null){focusListener.focusLost(e);}break;}super.processFocusEvent(e);}protected void processMouseEvent(MouseEvent e){ switch(e.getID()) {case MouseEvent.MOUSE_PRESSED:down=!down;repaint();if(mouseListener !=null){mouseListener.mousePressed(e);}break;case MouseEvent.MOUSE_RELEASED: if(down){fireActionEvent();down=false;repaint();}if(mouseListener !=null){mouseListener.mouseReleased(e);}break;case MouseEvent.MOUSE_CLICKED: if(mouseListener !=null){mouseListener.mouseClicked(e);}break;case MouseEvent.MOUSE_ENTERED: if(mouseListener !=null){mouseListener.mouseEntered(e);}break;case MouseEvent.MOUSE_EXITED: if(mouseListener !=null){mouseListener.mouseExited(e);}break;}super.processMouseEvent(e);}private void fireActionEvent() {//内部支持方法processActionEvent(new ActionEvent(this,ActionEvent.ACTION_PERFORMED,null));}}1.1.2JavaBean的事件编程1、通过事件处理机制所产生的效果可让一些组件作为事件源,发出可被描述环境或其它组件接收的事件。
从入门到精通学习Java编程的完整教程Java编程语言是目前最为广泛应用的编程语言之一,具有很强的跨平台特性和丰富的开发工具。
本文将为大家提供一个从入门到精通学习Java编程的完整教程,帮助读者系统学习Java编程的基础知识和高级技术。
一、Java编程基础知识1. 环境搭建Java开发环境的搭建是学习Java编程的第一步。
首先,需要下载并安装Java Development Kit(JDK),配置环境变量,以便能在命令行中运行Java编译器和虚拟机。
接下来,选择一个集成开发环境(IDE),如Eclipse或IntelliJ IDEA,以便更方便地编写、调试和运行Java程序。
2. 基本语法Java编程语言的基本语法包括变量声明和使用、基本数据类型、运算符和表达式、控制流程语句(if-else、for、while等)、数组和字符串等。
学习这些基础知识是理解和编写Java程序的基础。
3. 面向对象编程Java是一门面向对象的编程语言,理解面向对象的概念和特性是学习Java编程的关键。
面向对象的基本概念包括类和对象、封装、继承和多态等。
通过学习这些概念,可以设计和实现复杂的Java程序。
二、Java编程进阶技术1. 异常处理Java提供了异常处理机制,可以捕获和处理程序运行过程中可能出现的异常情况。
学习异常处理是编写健壮的Java程序的重要一步,可以保证程序在出现异常时能够有良好的响应和恢复机制。
2. 输入输出Java提供了丰富的输入输出操作方式,可以读写文件、网络通信等。
学习输入输出操作可以使Java程序更加灵活和实用,能够处理各种数据交互的需求。
3. 多线程编程多线程编程是Java编程中的一个重要主题。
通过使用多线程,可以使程序在同一时间执行多个任务,提高程序的并发性和效率。
学习多线程编程需要了解线程的概念、创建和管理线程、线程间的通信等。
4. 数据库操作Java可以与各种数据库进行交互,进行数据的读写和处理。
Java韩顺平笔记第1讲内容介绍.项目演示.原理剖析1. 课程包括:java面向对象编程,java图形界面,java数据库编程,java文件i/o流,java网络编程,java的多线程2. Java历史:1990 sun 启动绿色计划 1992 创建 oak语言—> java1994 gosling 参加硅谷大会演示java功能震惊世界 1995 sun 正式发布java第一个版本,目前最新的是jdk7.03. java开发工具:记事本,jcreator,jbuilder,netbean,eclipse4. jdk包括:jre(java运行环境)java的工具:编译器javac.exe解释执行器java.exe java的类库:3600多个,常用的150多个5. 第一个程序://功能:显示―HelloWorld‖//public:表示类是公共的,一个文件中只有一个public类 //class:表示这个是一个类//HelloWorld:类名(公共类的类名,必须和文件名一样)public class HelloWorld {//一个主函数,程序的入口 public static void main (String args[]) {//执行语句System.out.println("helloWorld!"); } }6. Java源程序(.java文件)——>java字节码文件(.class文件)——>由解释执行器(java.exe)将字节码文件加载到java虚拟机(jvm)——>字节码文件(.class)就会在java虚拟机中执行l,average); } }第2讲变量.数据类型1. 在java里面int占4个字节,long占8个字节2. Java基本数据类型:整数:(byte一个字节:-128---127 int四个字节:-2147483648---+2147483647short两个字节:-32768---+32767 long八个字节:)小数(浮点):float double布尔:boolean字符:char(两个字节,可以存放汉字, char test1 ='中';)引申到字符串(类)3.在java中对char进行运算的时候,直接是当做ASCII码对应的整数4.数据不能从高精度到低精度的转换Byte<short<int<long<float<doublefloat a=3.4;是过不去的,在java中小数默认是double(双精度)的应该写成是float a=3.4f;不过可以强制转换:int a=(int)1.2; intb=(int)1.95. int a=1;int b=a+1.2; a先是往高精度转换,然后赋给b,就报错改成int a=1;double b=a+1.2; 或者int a=1;float b=a+1.2f; 就解决了第4讲流程控制1. switch case语句中,switch条件表达式的数据类型应该和后面case的类型一致2. switch case语句中,可用的数据类型主要是:byte short int char enum第5讲类与对象1. 面向对象编程-类与对象类名首字母大写类里面的元素叫类的成员变量/属性2. 类的定义package 包名;class 类名extends 父类implements接口名{成员变量;构造方法;成员方法;}3. 如何创建对象:先声明再创建Cat cat1;cat1=new Cat();一步到位Cat cat1 =new Cat();4. 引用传递类似于指针一样第8讲this 类变量1. this属于类的对象的而不是属于类的2. 5this不能在类的外部使用,只能在类定义时候使用!3. 可以用类名直接访问静态变量第9讲类方法封装1.类变量是该类的所有对象共享的对象,一改全改了2.定义语法:访问修饰符static 数据类型变量名3. public class Demo9{static int i=1;static{System.out.println("zhixingyicile");i++;}//会自动执行一次,也只有一次public Demo9(){System.out.println("ffffffff");i++;}public static void main(String args[]){Demo9 t1=new Demo9();System.out.println(Demo9.i);Demo9 t2=new Demo9();System.out.println(i);}}4.类方法(静态方法、静态函数):属于所有对象实例的5.Java中:类变量(static)原则上用类方法(static)去访问;类方法中不能访问非静态变量,就是非类变量,但是普通的成员方法可以访问静态变量(类变量)使用:类名.类方法名对象名.类方法名6.非类变量就是实例变量,属于每个对象自己的7.Java面向对象编程的三(四)大特征:封装、继承、多态(、抽象)8.抽象:把一类事物的共有的属性和行为提取出来,形成一个物理模板,此研究问题的方法就是抽象9.封装:把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。
1.1JavaBean组件编程技术及应用实例(第1部分)1.1.1JavaBean组件相关编程技术1、Java语言的组件技术(1)JavaBean是什么?JavaBean 是一个特殊的类,这个类必须符合JavaBean规范。
JavaBean原来是为了能够在一个可视化的集成开发环境中可视化、模块化地利用组件技术开发应用程序而设计的。
JavaBean 是一种基于Java 的可复用的平台独立的软件组件,开发者可以在软件构造器工具中直接进行可视化操作,它是一种专门为当前软件开发者设计的全新的组件技术。
(2)JavaBean的种类它可以是简单的GUI元素,如按钮或滚动条;也可以是复杂的可视化软件组件,如数据库视图,但有些JavaBean是没有GUI表现形式的(称为非可视化软件组件),但这些JavaBean 仍然可以使用应用程序构造器可视化地进行组合。
一个JavaBean和一个Java Applet相似,是一个非常简单的遵循某种严格协议的Java 类。
每个JavaBean的功能都可能不一样,但它们都必须支持以下特征。
(3)JavaBean与微软的ActiveX的不同JavaBean是与平台无关的,而微软的ActiveX是基于Windows系统平台的。
2、一个标准的JavaBean组件应该满足以下几点特性(1)持续性持续性允许一个构件保存它的状态,因此它还能被重新创建。
JavaBeans持续性使用Java1.1环境对象序列化机制产生I/O流并在以后恢复。
构件创建者只需实现可序列化的接口以使构件保持持续。
持续的流可能为一个Java文件、一网络连接。
(2)制定性制定是JavaBean构件的新特性之一。
简而言之,Bean的创建者不仅创建运行状态的构件,而且还通过扩展ponent类创建了UI工具箱的类。
这个UI工具箱可被用来制定Bean的一个实例。
利用其它的构件模型,开发环境、可视化开发工具或任何其它的都必须提供所有对该构件的制定逻辑。
java教程从入门到精通Java是一种跨平台的高级编程语言,由Sun Microsystems于1995年推出。
虽然Java最初是为嵌入式系统开发设计的,但现在已经成为广泛应用于各个领域的一种编程语言。
入门部分:对于初学者来说,了解Java的基本语法和概念是非常重要的。
首先,你需要安装Java Development Kit(JDK),它包含了编译器和其他必要的工具。
安装完成后,你可以使用一个文本编辑器(如Notepad++)创建Java源文件,然后使用Javac命令将其编译成字节码文件。
Java的基础语法与C和C++相似,包括变量的声明和赋值、条件语句、循环语句以及函数的定义。
在学习Java的过程中,你需要理解面向对象编程的概念,如类、对象、继承、封装和多态。
这些概念是Java的核心,也是Java与其他编程语言的主要区别。
在掌握了基础语法和面向对象的概念后,你可以开始学习Java的核心库。
Java的标准库包含了各种功能强大的类和方法,可以帮助你轻松处理输入输出、字符串操作、文件操作、网络通信等。
此外,还有一些特殊的库,如图形用户界面库(Swing和JavaFX)、数据库连接库(JDBC)等,可以帮助你开发更加复杂的应用程序。
进阶部分:一旦你熟悉了Java的基础知识和核心库,你可以开始学习一些高级的主题。
比如,异常处理、多线程编程、反射、注解和Lambda表达式等。
这些主题可以帮助你编写更加健壮和高效的Java程序。
此外,你还可以学习一些设计模式,如单例模式、观察者模式和工厂模式等。
设计模式是一些经过验证的软件设计解决方案,可以帮助你更好地组织和结构化你的代码。
精通部分:当你熟练掌握Java的基础知识、核心库和高级主题后,你可以开始思考如何使用Java开发复杂的应用程序。
你可以学习一些框架,如Spring、Hibernate和Struts等,这些框架可以帮助你更加方便地开发企业级应用程序。
此外,你还可以学习一些其他的技术,如Java虚拟机(JVM)的内部工作原理、性能调优、代码优化等。
EJB轻松进阶之一EJB轻松进阶一、引言EJB(Enterprise JavaBeans)是Java程序设计中比较高级的内容,也是Java程序员由入门级向高手级前进的门槛。
本文首先以一个例程介绍了一般分布式对象应用程序的基本原理,然后从基本的下载、安装、配置开始,逐步介绍EJB程序编程的方法,从而使EJB的学习成为一件轻松而有趣的事情。
二、典型的分布式对象程序不管是CORBA还是RMI,其实现分布式对象的策略都是相似的,我们可以用一个简单的程序例子来模拟一个分布式对象程序的构成。
这个例子模拟了一个远程请求对象属性的过程。
有一个远程对象Dog在网络上,现在要得到它的名字(strName)属性。
程序在客户端设一个存根(Dog_Stub)类,在服务器端启动一个骨架(dog_Skeleton)类,这两个类都实现了Dog接口,Dog_Stub与Dog_Skeleton通过Socket进行远程通信。
当客户程序DogClient 向Dog_Stub发出获取名字属性的请求时,Dog_Stub对象把方法名“getName()”作为一个字符串通过Socket 发给远程的Dog_Skeleton对象,Dog_Skeleton对象收到这个字符串后再根据字符串的内容执行DogServer 对象的getName()方法,得到Dog的名字,然后又通过Socket返回给DogStub对象。
整个流程通过网络实现,但对于客户程序DogClient来讲,它并不知道真正的Dog对象在哪里,甚至也不知道这个过程通过了网络,它只知道发出的获取名字属性的请求得到了满意的结果而已。
事实上,CORBA或Java RMI的实现方式与此类似,只不过远没有这么简单而已。
这个程序对于说明分布式对象应用程序的执行机理是很有用的。
程序源代码如下所示:文件Dog.javapublic interface Dog{public String getName() throws Exception;}/* Dog */文件DogClient.javapublic class DogClient{public static void main( String[] args ) throws Exception{Dog dog = new Dog_Stub();String strName = dog.getName();System.out.println( "姓名:" + strName );}//main()}/* DogClient */文件DogServer.javapublic class DogServer implements Dog{String strName;int intAge;public String getName() throws Exceptionreturn strName;}//getName()public DogServer( String strNameInput ){strName = strNameInput;}//DogServer()public static void main( String[] args ) throws Exception{New Dog_Skeleton( new DogServer( "TOMCAT" ) );}//main()}/* DogServer */文件Dog_Skeleton.javaimport java.io.*;import .*;public class Dog_Skeleton extends Thread{static ServerSocket ss = null;DogServer ds;public Dog_Skeleton( DogServer dsInput ) throws Exception{ds = dsInput;if ( ss == null )ss = new ServerSocket( 8000 );this.start();}//Dog_Skeleton()public synchronized void run(){Try{while ( ss != null ){Socket socket = ss.accept();ObjectInputStream ois = new ObjectInputStream( socket.getInputStream() ); ObjectOutputStream oos = new ObjectOutputStream( socket.getOutputStream() ); String strMethodName = ( String )ois.readObject();if ( strMethodName.equals( "getName()" ) )oos.writeObject( ds.getName() );oos.flush();ois.close();oos.close();socket.close();}//while}//trycatch( Exception e ){e.printStackTrace();}//catch}//run()}/* Dog_Skeleton */文件Dog_Stub.javaimport java.io.*;import .*;Public class Dog_Stub implements Dog{Socket socket;ObjectOutputStream oos;ObjectInputStream ois;public Dog_Stub() throws Exception{socket = new Socket( "wudi", 8000 );Oos = new ObjectOutputStream( socket.getOutputStream() );Ois = new ObjectInputStream( socket.getInputStream() );}//Dog_Stub()public String getName() throws Exception{Oos.writeObject( "getName()" );Oos.flush();return ( String )ois.readObject();}//getName()}/* Dog_Stub */运行该分布式对象程序时,首先运行DogServer,然后在客户端运行DogClient即可看到结果。
JavaBeans程序开发从入门到精通教程精解JavaBeans的属性JavaBeans的属性与一般Java程序中所指的属性,或者说与所有面向对象的程序设计语言中对象的属性是一个概念,在程序中的具体体现就是类中的变量。
在JavaBeans 设计中,按照属性的不同作用又细分为四类:Simple,Index,Bound与Constrained属性。
1、Simple属性一个简单属性表示一个伴随有一对get/set方法(C语言的过程或函数在Java程序中称为"方法")的变量。
属性名与和该属性相关的get/set方法名对应。
例如:如果有setX和getX方法,则暗指有一个名为"X"的属性。
如果有一个方法名为isX,则通常暗指"X"是一个布尔属性(即X的值为true或false)。
例如在下面这个程序中:2、Indexed属性一个Indexed属性表示一个数组值。
使用与该属性对应的set/get方法可取得数组中的数值。
该属性也可一次设置或取得整个数组的值。
例:3、Bound属性一个Bound属性是指当该种属性的值发生变化时,要通知其它的对象。
每次属性值改变时,这种属性就点火一个PropertyChange事件(在Java程序中,事件也是一个对象)。
事件中封装了属性名、属性的原值、属性变化后的新值。
这种事件是传递到其它的Beans,至于接收事件的Beans应做什么动作由其自己定义。
当PushButton的background属性与Dialog的background属性bind时,若PushButton 的background属性发生变化时,Dialog的background属性也发生同样的变化。
例:通过上面的代码,开发工具调用changes的addPropertyChangeListener方法把其它JavaBeans注册入ourString属性的监听者队列l中,l是一个Vector数组,可存储任何Java对象。
开发工具也可使用changes的removePropertyChangeListener方法,从l中注销指定的对象,使alden3的ourString属性的改变不再与这个对象有关。
当然,当程序员手写代码编制程序时,也可直接调用这两个方法,把其它Java对象与alden3挂接。
4、Constrained属性一个JavaBeans的constrained属性,是指当这个属性的值要发生变化时,与这个属性已建立了某种连接的其它Java对象可否决属性值的改变。
constrained属性的监听者通过抛出PropertyVetoException来阻止该属性值的改变。
例:下面程序中的constrained 属性是PriceInCents。
从上面的例子中可看到,一个constrained属性有两种监听者:属性变化监听者和否决属性改变的监听者。
否决属性改变的监听者在自己的对象代码中有相应的控制语句,在监听到有constrained属性要发生变化时,在控制语句中判断是否应否决这个属性值的改变。
总之,某个Beans的constrained属性值可否改变取决于其它的Beans或者是Java对象是否允许这种改变。
允许与否的条件由其它的Beans或Java对象在自己的类中进行定义。
JavaBeans的事件事件处理是JavaBeans体系结构的核心之一。
通过事件处理机制,可让一些组件作为事件源,发出可被描述环境或其它组件接收的事件。
这样,不同的组件就可在构造工具内组合在一起,组件之间通过事件的传递进行通信,构成一个应用。
从概念上讲,事件是一种在"源对象"和"监听者对象"之间,某种状态发生变化的传递机制。
事件有许多不同的用途,例如在Windows系统中常要处理的鼠标事件、窗口边界改变事件、键盘事件等。
在Java和JavaBeans中则是定义了一个一般的、可扩充的事件机制,这种机制能够:对事件类型和传递的模型的定义和扩充提供一个公共框架,并适合于广泛的应用。
与Java语言和环境有较高的集成度。
事件能被描述环境捕获和点火。
能使其它构造工具采取某种技术在设计时直接控制事件,以及事件源和事件监听者之间的联系。
事件机制本身不依赖于复杂的开发工具。
特别地,还应当:能够发现指定的对象类可以生成的事件。
能够发现指定的对象类可以观察(监听)到的事件。
提供一个常规的注册机制,允许动态操纵事件源与事件监听者之间的关系。
不需要其它的虚拟机和语言即可实现。
事件源与监听者之间可进行高效的事件传递。
能完成JavaBeans事件模型与相关的其它组件体系结构事件模型的中立映射。
JavaBeans事件模型的主要构成有:事件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用进行的。
对每个明确的事件的发生,都相应地定义一个明确的Java方法。
这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承java.util.EventListener。
实现了事件监听者接口中一些或全部方法的类就是事件监听者。
伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继承自java.util.EventObject。
事件状态对象作为单参传递给应响应该事件的监听者方法中。
发出某种特定事件的事件源的标识是:遵从规定的设计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实例的引用。
有时,事件监听者不能直接实现事件监听者接口,或者还有其它的额外动作时,就要在一个源与其它一个或多个监听者之间插入一个事件适配器类的实例,来建立它们之间的联系。
事件状态对象(Event State Object)与事件发生有关的状态信息一般都封装在一个事件状态对象中,这种对象是java.util.EventObject的子类。
按设计习惯,这种事件状态对象类的名应以Event结尾。
例如:事件监听者接口(EventListener Interface)与事件监听者由于Java事件模型是基于方法调用,因而需要一个定义并组织事件操纵方法的方式。
JavaBeans中,事件操纵方法都被定义在继承了java.util.EventListener类的EventListener接口中,按规定,EventListener接口的命名要以Listener结尾。
任何一个类如果想操纵在EventListener接口中定义的方法都必须以实现这个接口方式进行。
这个类也就是事件监听者。
例如:在接口中只定义方法名,方法的参数和返回值类型。
如:上面接口中的mouseMoved方法的具体实现是在下面的ArbitraryObject类中定义的。
ArbitraryObject就是MouseMovedExampleEvent事件的监听者。
事件监听者的注册与注销为了各种可能的事件监听者把自己注册入合适的事件源中,建立源与事件监听者间的事件流,事件源必须为事件监听者提供注册和注销的方法。
在前面的bound属性介绍中已看到了这种使用过程,在实际中,事件监听者的注册和注销要使用标准的设计格式:例如:首先定义了一个事件监听者接口:接着定义事件源类:在程序中可见事件源Model类显式地调用了接口中的modelChanged方法,实际是把事件状态对象e作为参数,传递给了监听者类中的modelChanged方法。
适配类适配类是Java事件模型中极其重要的一部分。
在一些应用场合,事件从源到监听者之间的传递要通过适配类来"转发"。
例如:当事件源发出一个事件,而有几个事件监听者对象都可接收该事件,但只有指定对象做出反应时,就要在事件源与事件监听者之间插入一个事件适配器类,由适配器类来指定事件应该是由哪些监听者来响应。
适配类成为了事件监听者,事件源实际是把适配类作为监听者注册入监听者队列中,而真正的事件响应者并未在监听者队列中,事件响应者应做的动作由适配类决定。
目前绝大多数的开发工具在生成代码时,事件处理都是通过适配类来进行的。
JavaBeans用户化JavaBeans开发者可以给一个Beans添加用户化器(Customizer)、属性编辑器(PropertyEditor)和BeansInfo接口来描述一个Beans的内容,Beans的使用者可在构造环境中通过与Beans附带在一起的这些信息来用户化Beans的外观和应做的动作。
一个Beans不必都有BeansCustomizer、PrpertyEditor和BeansInfo,根据实际情况,这些是可选的,当有些Beans较复杂时,就要提供这些信息,以Wizard的方式使Beans 的使用者能够用户化一个Beans。
有些简单的Beans可能这些信息都没有,则构造工具可使用自带的透视装置,透视出Beans的内容,并把信息显示到标准的属性表或事件表中供使用者用户化Beans,前几节提到的Beans的属性、方法和事件名要以一定的格式命名,主要的作用就是供开发工具对Beans进行透视。
当然也是给程序员在手写程序中使用Beans提供方便,使他能观其名、知其意。
用户化器接口(Customizer Interface)当一个Beans有了自己的用户化器时,在构造工具内就可展现出自己的属性表。
在定义用户化器时必须要实现java.Beanss.Customizer接口。
例如,下面是一个"按钮"Beans的用户化一器:属性编辑器接口(PropertyEditor Interface)一个JavaBeans可提供PropertyEditor类,为指定的属性创建一个编辑器。
这个类必须继承自java.Beanss.PropertyEditorSupport类。
构造工具与手写代码的程序员不直接使用这个类,而是在下一小节的BeansInfo中实例化并调用这个类。
例:上例中是为Tags属性创建了属性编辑器,在构造工具内,可从下拉表格中选择MoleculeName的属性应是"HyaluronicAid"或是"water"。
BeansInfo接口每个Beans类也可能有与之相关的BeansInfo类,在其中描述了这个Beans在构造工具内出现时的外观。
BeansInfo中可定义属性、方法、事件,显示它们的名称,提供简单的帮助说明。
例如:JavaBeans持久化当一个JavaBeans在构造工具内被用户化,并与其它Beans建立连接之后,它的所有状态都应当可被保存,下一次被load进构造工具内或在运行时,就应当是上一次修改完的信息。
为了能做到这一点,要把Beans的某些字段的信息保存下来,在定义Beans时要使它实现java.io.Serializable接口。