﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-程序人生-随笔分类-JAVA</title><link>http://www.blogjava.net/zuroc/category/431.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 19:26:44 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 19:26:44 GMT</pubDate><ttl>60</ttl><item><title>例解 VC++ 6.0 实现 JNI</title><link>http://www.blogjava.net/zuroc/archive/2005/04/07/2908.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Thu, 07 Apr 2005 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/04/07/2908.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2908.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/04/07/2908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2908.html</trackback:ping><description><![CDATA[<!-- BEGIN MASTHEAD --><!-- BEGIN VNV1 MASTHEAD COMPONENT, thinner variation for content pages -->&nbsp;
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD>
<TABLE border=0 cellPadding=0 cellSpacing=0 class=topnav height=25 width="100%">
<FORM action=http://developer.sun.com/dispatcher.jsp method=post name=formsearch>
<TBODY>
<TR>
<TD><IMG alt="" border=0 height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD>
<TD><A href="http://gceclub.sun.com.cn/">gceclub.sun.com.cn</A></TD>
<TD width="100%">&nbsp;</TD>
<TD noWrap><B>Search:</B>&nbsp;</TD>
<TD></TD>
<TD>&nbsp;</TD>
<TD class=selectcell><SELECT class=globalsearch name=uid> <OPTION selected value=6910018>英文开发者网站</OPTION></SELECT></TD>
<TD>&nbsp;</TD>
<TD align=left vAlign=center><INPUT border=0 class=buttonred onmouseout="this.style.color='#FFF';" onmouseover="this.style.color='#fbe249';" type=submit value=&nbsp;»&nbsp;></TD>
<TD><IMG alt=" " height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD></TR></FORM></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD><IMG alt=" " border=0 height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD>
<TD class=grey3 vAlign=top></TD>
<TD><IMG alt=" " border=0 height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD>
<TD class=sunblue noWrap vAlign=top>
<DIV class=pad3>&nbsp;</DIV></TD>
<TD align=right class=sunblue vAlign=top width="100%">
<DIV class=pad10>&nbsp;</DIV></TD>
<TD><IMG alt=" " border=0 height=1 src="http://gceclub.sun.com.cn/include/a.gif" width=10></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><SPAN class=sp5>&nbsp;</SPAN><BR><!-- END VNV1 MASTHEAD COMPONENT, thinner variation for content pages --><!-- END MASTHEAD --><!-- BEGIN BREADCRUMB -->
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD height=24>
<DIV class=breadcrumb><A href="http://gceclub.sun.com.cn/">首页</A> &gt; <A href="http://gceclub.sun.com.cn/yuanchuang/index.html">网友原创文章</A> </DIV></TD></TR></TBODY></TABLE><!-- END BREADCRUMB --><!-- 正文开始 -->
<TABLE align=center border=0 cellPadding=0 cellSpacing=10 width="100%">
<TBODY>
<TR>
<TD>
<P>作者：<A href="http://gceclub.sun.com.cn/yuanchuang/week-15/jni.html#about">陈健明</A></P><A name=about></A>
<H4>作者简介</H4><BR>
<P>陈健明，华中师范大学网络与通讯研究所，您可以通过<A href="mailto:chenjm2000@hotmail.com">chenjm2000@hotmail.com</A>和作者取得联系。</P>
<H4>内容摘要</H4><BR>
<P>JNI是JDK的一部分，用于为Java提供一个本地代码的接口。通过使用JNI编写的程序能够确保你的代码能够完全的移植到所有的平台。JNI使得运行在JVM虚拟机上的Java代码能够操作使用其它语言编写的应用程序和库，比如C/C++以及汇编语言等。此外JNI提供的某些API还允许你把JVM嵌入到本地应用程序中。下图表达了JNI所扮演的角色。</P>
<P><IMG alt="" border=0 height=178 src="http://gceclub.sun.com.cn/yuanchuang/week-15/jni-01.jpg" width=269></P>
<P>本文将通过一个实例来阐述使用VC++6.0来实现JNI的完整过程。使用JNI来整合本地代码和Java代码的步骤是确定的，没有再创作的余地，所以读者可以通过本文的步骤来逐步认识到，其实Java也是"没有什么不可以"的。</P>
<H4>一、JNI的实现</H4><BR>
<P>任务描述：在Java中调用windows下的消息框函数，并且从Java中传递一个字符串作为MessageBox函数的显示文本参数，显示在消息框的中间。下面让我们一起进入这一奇妙的旅程。</P>
<P><B>Step 1</B>：写一个Java类，在这个类中包含了需要调用的本地方法的描述。</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>//WinMsgBox.java
package edu.netcom.jni;
public class WinMsgBox  
{
	static{
		System.loadLibrary("WinMsgDll");    // (1)
	}
	public native void showMsgBox(String str);  // (2)
}
</PRE></TD></TR></TBODY></TABLE><BR>
<P>(1)中WinMsgDll是动态链接文件的文件名，不用加扩展名，因为在不同的平台下动态链接文件扩展名是不同的，由JVM自动识别，比如在Solaris下，会被转换为WinMsgDll.so；而Win32环境下会转换为WinMsgDll.dll。这个文件名必须和Step 4中生成的文件名一致。这个文件的存放位置也很重要，它只能被放在JVM属性值java.library.path中指定的文件夹中。这个属性值可以使用System.getProperty("java.library.path");来查看。一般情况下，至少放在这几个位置是确定可靠的，windows安装目录下的system32下面，JDK安装目录下的bin下面，以及调用主类文件的当前目录。</P>
<P>(2)中指明了你必须用本地代码实现的方法。</P>
<P><B>Step 2</B>：提示符下使用命令javac -d . WinMsgBox.java编译Step 1编写的java文件。</P>
<P>此时会在当前目录下建立一个edu\netcom\jni目录结构，并且一个WinMsgBox.class文件存在其中。</P>
<P><B>Step 3</B>：提示符下使用命令javah -jni edu.netcom.jni.WinMsgBox，此时会在当前目录下产生一个edu_netcom_jni_WinMsgBox.h文件，注意这个文件名是由（包名+类名）组成，中间用（_）隔开。此文件内容如下：</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>/* DO NOT EDIT THIS FILE - it is machine generated */
#include &lt;jni.h&gt;                       // (1)
/* Header for class edu_netcom_jni_WinMsgBox */

#ifndef _Included_edu_netcom_jni_WinMsgBox
#define _Included_edu_netcom_jni_WinMsgBox
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     edu_netcom_jni_WinMsgBox
 * Method:    showMsgBox
 * Signature: (Ljava/lang/String;)V       // (2)
 */
JNIEXPORT void JNICALL Java_edu_netcom_jni_WinMsgBox_showMsgBox
  (JNIEnv *, jobject, jstring);           // (3)

#ifdef __cplusplus
}
#endif
#endif
</PRE></TD></TR></TBODY></TABLE><BR>
<P>(1)包含的jni.h存在于JDK安装目录下的include下面。</P>
<P>(2)(Ljava/lang/String;)V这是函数的标记符，当从本地方法端访问Java端的方法时，会用到这个标记符。JNI中为每种数据类型也定义了标记符，标记符的规则请查看JNI标准文档。</P>
<P>(3)在WinMsgBox.java中本地方法void showMsgBox(String str);的定义，被映射为JNIEXPORT void JNICALL Java_edu_netcom_jni_WinMsgBox_showMsgBox(JNIEnv *, jobject, jstring); 其中函数名的映射规则是（Java_包名_类名_方法名），如果存在重载的方法，则在后面还会增加每个参数的标记符。每一个方法映射到本地C函数后都会增加两个参数：JNIEnv *和jobject，关于这两个参数的用法将在后面阐述。另外，所有Java中的数据类型都会按一定规则进行映射为本地数据类型，这些数据类型都是在jni.h中定义的。下面分别按照基本数据类型，和对象类型列出。</P>
<P>表1 Java基本类型到本地类型的映射</P>
<P><IMG alt="" border=0 height=236 src="http://gceclub.sun.com.cn/yuanchuang/week-15/jni-02.jpg" width=590></P>
<P>表2 Java中的类到本地类型的映射</P>
<P><IMG alt="" border=0 height=323 src="http://gceclub.sun.com.cn/yuanchuang/week-15/jni-03.jpg" width=623></P>
<P><B>Step 4</B>：使用VC来编写本地方法的实现函数，最后编译成.dll文件。过程如下：</P>
<P>1) 选择new-&gt;projects(选择Win32 Dynamic-Link Library，以Step 1中指定的库名WinMsgDll作为工程名)-&gt;OK-&gt;An ampty DLL project-&gt;Finish。</P>
<P>2) 选择Tools-&gt;Options-&gt;Directories(添加目录D:\J2SDK1.4.2_03\INCLUDE和D:\J2SDK1.4.2_03\INCLUDE\WIN32)。在这些目录中包含JNI所需的头文件。</P>
<P>3) 将Step 3生成的edu_netcom_jni_WinMsgBox.h拷贝到WinMsgDll工程文件夹中。然后FileView中添加这个头文件。</P>
<P>4) 添加源文件WinMsgDll.cpp，内容如下：</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>#include "windows.h"
#include "edu_netcom_jni_WinMsgBox.h"
/*
 * Class:     edu_netcom_jni_WinMsgBox
 * Method:    showMsgBox
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_edu_netcom_jni_WinMsgBox_showMsgBox
(JNIEnv * env, jobject obj, jstring str){
	const char *msg;
	msg = env-&gt;GetStringUTFChars(str,0);
	MessageBox(NULL,msg,"Java invoke",MB_OK);
	env-&gt;ReleaseStringUTFChars(str,msg);
}
</PRE></TD></TR></TBODY></TABLE><BR>
<P>5) 编译生成WinMsgBox.dll文件。并将这个.dll文件拷贝到Step 1中说明的目录中。</P>
<P><B>注意：</B></P>
<P>1) 我们知道dll文件有两种指明导出函数的方法，一种是在.def文件中定义，另一种是在定义函数时使用关键字__declspec(dllexport)。而在JNI中函数定义中的关键字JNIEXPORT实际在jni_md.h中如下定义，#define JNIEXPORT __declspec(dllexport)，可见JNI默认的导出函数使用第二种。使用第二种方式产生的导出函数名会根据编译器发生变化，在有的情况下会发生找不到导出函数的问题（我们在JSP中使用JNI时就发生了这种问题，百思不得其解，后来强行加入一个.def文件就解决了）。因此最好是使用第一种方法自己定义一个.def文件来指明导出函数，这种情况下会强制使用第一种方式产生导出函数。本例中可以加入一个WinMsgDll.def文件，内容如下：</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>LIBRARY      "WinMsgDll"
DESCRIPTION  'message Windows Dynamic Link Library'
EXPORTS
    ; Explicit exports can go here
	Java_edu_netcom_jni_WinMsgBox_showMsgBox
</PRE></TD></TR></TBODY></TABLE><BR>
<P>2) 从本例中，我们可以看到WinMsgBox.java决定了edu_netcom_jni_WinMsgBox.h，而后者又决定了WinMsgDll.dll，也就是说，这是一个"牵一发而动全身"的过程，如果你改动了WinMsgBox.java，就一定要把整个步骤都走一遍（这一点一定要切记，因为这也是我们跌得鼻青脸肿后才得出的警世良言）。</P>
<P>3) 生成的.dll文件一定要正确拷贝到Step 1说明的目录中，本例中是将生成的WinMsgDll.dll和Step 5中的测试文件放在同一个目录下的（这也是我们困惑了很久才解决的问题）。</P>
<P><B>Step 5</B>：编写一个测试文件来测试对WinMsgDll.dll的调用。测试文件TestJNI.java内容如下：</P>
<TABLE border=0 cellPadding=10 cellSpacing=0 class=grey4>
<TBODY>
<TR>
<TD><PRE>//TestJNI.java
import edu.netcom.jni.WinMsgBox;
public class TestJNI 
{
	public static void main(String[] args) 
	{
		     WinMsgBox box = new WinMsgBox();
		box.showMsgBox("Wonderful!!");
	}
}
</PRE></TD></TR></TBODY></TABLE><BR>
<P>编译，运行，windows下的对话框跃然屏幕中间。到此为此，整个JNI的实现过程就已经完成了。</P>
<H4>二、补充说明</H4><BR>
<P>JNI为程序员提供了一种方法，使得他们能够充分利用JVM以外的，完全由平台决定的功能。但是你不应该滥用JNI。大多数情况可能是因为这样而必须使用JNI，如你已经有做好了的本地.dll文件，其中已经包含了大量呕心沥血的函数，而你不愿意，也不可能完全用Java重写它们，那么此时你应该用JNI。但是你必须按前面的步骤来进行，只是在Step 4中编写的.dll要调用已有的本地.dll，也就是说用Step 4中的.dll"封装"已有的.dll。</P>
<P>在Java中定义的本地方法映射到本地C函数后都会增加两个参数：JNIEnv *和jobject。第一个参数JNIEnv是一个指针，指向在jni.h中定义的一个数据结构，结构中包含了一系列的函数的指针，我们把它们称之为JNI函数。使用这些JNI函数可以使程序员从本地函数这一侧完成对Java的操作，如访问Java字符串、数组、调用Java的方法、成员变量、甚至处理Java端的异常等。第二个参数会根据Java类中本地方法的定义不同而不同，如果是定义为static方法，类型会是jclass，表示对特定Class对象的引用，如果是非static方法，类型是jobject，表示当前对象的引用（本例中就是对WinMsgBox对象的引用），相当于this。</P>
<P>C函数通过JNI接受来自Java的传参也是按基本类型直接传值，对象传引用。对于基本类型可以按照表1来使用，其它类型都必须使用JNI函数进行转换后才能在C函数中使用。如本例中从Java中传递了一个字符串，映射为JNI类型jstring。使用JNI函数GetStringUTFChars将jstring转换为UTF-8字符串，然后便可以使用C语言中的任何字符串操作函数进行操作。由于JVM在调用本地方法时，是在虚拟机中开辟了一块本地方法栈供本地方法使用，当本地方法使用完UTF-8串后，必须使用ReleaseStringUTFChars，通过它来通知虚拟机去回收UTF-8串占用的内存，否则将会造成内存泄漏，最终导致系统崩溃。同样的，如果需要将C函数返回的返回值能够正确通过JNI传给Java，也要使用JNI函数转换为前面两个表中的类型。</P>
<P>关于 JNI 函数的权威文档请参阅 <A href="http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html">Java Native Interface 1.5 Specification</A></P>
<P>关于 JNI 函数的教程请参阅 <A href="http://java.sun.com/docs/books/tutorial/native1.1/index.html">Java Native Interface Tutorial</A></P></TD></TR></TBODY></TABLE><!-- 正文结束 --><!-- BEGIN VNV5 FOOTER  -->
<TABLE border=0 cellPadding=0 cellSpacing=10 width="100%">
<TBODY>
<TR>
<TD>
<TABLE border=0 cellPadding=0 cellSpacing=0 class=vatop width="100%">
<TBODY>
<TR>
<TD class=grey3 colSpan=2 vAlign=top><IMG alt=" " border=0 height=2 src="http://gceclub.sun.com.cn/include/a.gif" width=1></TD></TR>
<TR>
<TD width=180><IMG alt=" " border=0 height=29 src="http://gceclub.sun.com.cn/include/logo_sun_small_sdn.gif" vspace=5 width=61></TD>
<TD vAlign=top>
<DIV class=footer><A href="http://cn.sun.com/aboutsun/">关于Sun公司</A>&nbsp;|&nbsp;&nbsp;<A href="http://cn.sun.com/contact/">联系我们</A>&nbsp;|&nbsp;&nbsp;<A href="http://cn.sun.com/share/termsofuse.html">使用条款</A>&nbsp;|&nbsp;&nbsp;<A href="http://cn.sun.com/privacy/">隐私政策</A><BR>Copyright 1994-2004 Sun Microsystems, Inc.</DIV></TD></TR>
<TR>
<TD class=grey3 colSpan=2 vAlign=top><IMG alt=" " border=0 height=2 src="http://gceclub.sun.com.cn/include/a.gif" width=1></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- END VNV5 FOOTER --><img src ="http://www.blogjava.net/zuroc/aggbug/2908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-04-07 13:11 <a href="http://www.blogjava.net/zuroc/archive/2005/04/07/2908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精品程序书籍下载</title><link>http://www.blogjava.net/zuroc/archive/2005/03/26/2483.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Sat, 26 Mar 2005 09:55:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/26/2483.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2483.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/26/2483.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2483.html</trackback:ping><description><![CDATA[<P><A target=blank href="http://www.netyi.net/in.asp?id=zuroc"><FONT size=4>精品程序书籍下载</FONT></A></P><img src ="http://www.blogjava.net/zuroc/aggbug/2483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-26 17:55 <a href="http://www.blogjava.net/zuroc/archive/2005/03/26/2483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Java多媒体框架设计"自播放电影"</title><link>http://www.blogjava.net/zuroc/archive/2005/03/15/2110.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Tue, 15 Mar 2005 12:51:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/15/2110.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/2110.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/15/2110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/2110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/2110.html</trackback:ping><description><![CDATA[<TABLE align=center bgColor=#f7f7f7 border=0 cellPadding=0 cellSpacing=0 width="95%">
<TBODY>
<TR>
<TD height=30>
<DIV align=center>
<DIV align=center>作者：　时间： 2004年2月12日 16:47:17　来源：<A href="http://www.yesky.com/" target=_blank>yesky</A></DIV></DIV></TD></TR>
<TR>
<TD bgColor=#f7f7f7>
<TABLE align=center cellSpacing=10 width="100%">
<TBODY>
<TR>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;如果把Java媒体框架（http://java.sun.com/jmf）看作客户端安装的媒体播放机的话，那么这种框架并不是非常激动人心。它只支持少量媒体类型，并且事实上这些媒体类型都被象Windows媒体播放机以及QuickTime等其它的应用程序支持。<BR><BR>　　但是从内容供应商的观点来看，下面这个事实更加有意义：JMF在所有的Java类型中都可用，这使在客户端上不必要有任何特定的媒体技术就可以部署媒体--所需要的只是J2SE Java运行时间。<BR><BR>　　更重要的是它能利用.jar文件格式的一些性能把解码器和媒体组成到一个文件中，创建一个"自我播放电影"，使用了象WinZip和StuffIt这样的压缩应用程序大致相同的方式来创建自我展开文档。<BR><BR>　　我们把此分为三个阶段：<BR><BR>　　1．使JMF能够播放.jar文件中的媒体。<BR><BR>　　2．只使用需要播放本地媒体所需的JMF的一部分创建一个轻量级.jar文件。<BR><BR>　　3．将代码和媒体放入.jar文件，并且创建一个合适的manifest文档以使它可以双击。<BR><BR>　　基本的JMF播放的关键是获得Player，能解码和渲染你的媒体。一般来说，这通过使用Manager获得合适的DataSource来完成，在一个播放实例中提供了媒体流和流元数据，例如媒体格式。Manager然后找到一个Player来处理 DataSource。在两种情况下，Manager结合一个带有程序包前缀列表（象javax.media、com.ibm.media等等）的反射方案来试图寻找合适的类，例如如果一个计划的播放程序不能接受提供给它的DataSource，那么它就会抛出异常。<BR><BR>　　Manager没有太多事要做，只是察看一下URL中的协议和文件扩展名，所以虽然它可以很容易的知道如何处理file:///Users/cadamson/mymp3stash/some.mp3，但是它不知道如何处理象jar:file:/Users/cadamson/dev/jmftests/spmovie-old/src/gatsbymovie.jar!/movie/themovie.mov这样的URL。<BR><BR>　　为了缓和这种情况，我们可以写一个DataSource，说得更准确一点就是一个PullDataSource，担负为Manager描述细节的责任。JarEntryDataSource中没有一个方法特别难；我们提供的PullSourceStream还需要实现几个超级接口。 <BR>它有些不够完美，但是这个类依靠文件扩展名来返回"内容类型"。这多多少少有点象一个MIME类型，除了使用句号代替斜线符号来格式化以外，所以它可被用于程序包名称（例如video/mpeg MIME类型变成video.mpeg，所以Manager可以找到com.sun.media.codec.video.mpeg包）。下面是我们的简单的实现：<BR><BR>
<TABLE bgColor=#ffffff width=500>
<TBODY>
<TR>
<TD>
<P>public String getContentType() {<BR>　try {<BR>　　URL url = getLocator().getURL();<BR>　　String urlFile = url.getFile();<BR>　　if (urlFile.endsWith(".mov"))<BR>　　　return "video.quicktime";<BR>　　else if (urlFile.endsWith(".mpg"))<BR>　　　return "video.mpeg";<BR>　　else if (urlFile.endsWith(".avi"))<BR>　　　// Manager needs '_' insted of '-'<BR>　　　return "video.x_msvideo";<BR>　　else<BR>　　　return "unknown";<BR>　} catch (MalformedURLException murle) {<BR>　　　return "unknown";<BR>　}<BR>} </P></TD></TR></TBODY></TABLE><BR>　　另一个烦恼是JMF源代码表明如果提供的流是Seekable的话（这是一个提供随机存取seek()方法的接口），默认Player只能播放一个QuickTime DataSource。如果寻找点在流的非常上流的地方，那么JarEntryDataSource中的策略是使用InputStream.skip()。如果寻找点在当前读取点之后（调用tellPoint，因为它的值通过Seekable.tell ()方法返回），然后它必须关闭InputStream，再重新打开，跳到寻找点。它使用一个内部的thoroughSkip()方法来确定我们实际上停在哪里。<BR><BR>
<TABLE bgColor=#ffffff width=500>
<TBODY>
<TR>
<TD>public long seek (long position) {<BR>　try {<BR>　　if (position &gt; tellPoint) {<BR>　　　thoroughSkip (position - tellPoint);<BR>　　} else {<BR>　　　close();<BR>　　　open();<BR>　　　thoroughSkip (position);<BR>　　}<BR>　　return tellPoint;<BR>　} catch (IOException ioe) {<BR>　　return 0; // bogus...<BR>　}<BR>}</TD></TR></TBODY></TABLE><BR>　　使用这个类，Manager可以找到一个可用的Player用于播放.jar文件中的.mov或者.avi文件。我们的示例的TinyPlayer使用ClassLoader.getResource ()方法来在类路径中寻找movie/themovie.mov或者movie/themovie.avi。当类路径只包含.jar文件的时候，我们将对其进行设置。<BR>
<TABLE align=center cellSpacing=10 width="100%">
<TBODY>
<TR>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;准备一个合适的.jar文件中的第一步是使用JMF的jmfcustomizer工具来创建一个jar，只使用播放我们的媒体所需要类，去掉用于流、捕捉、译码和其它对于一个简化的播放程序不需要的函数。不幸的是，Sun在各种Java版本的JMF中都不包含jmfcustomizer的帮助文件，但是各种定制屏幕很容易设计出来：<BR><BR>　　1．媒体源和媒体汇点：选择"媒体文件"和"播放"。<BR><BR>　　2．协议：只是"文件"。<BR><BR>　　3．源媒体格式："QuickTime (.mov)"和"Avi"。<BR><BR>　　4．解码器：无论你计划在你的媒体中使用什么解码器，但是用于音频的大部分都是"A - law"、"U - law"或"IMA4"，用于视频的是"H263"。不要为编码器、封包器和解包器而费心。<BR><BR>　　5．渲染：在音频中，我们需要"JavaSound"用于Java 1.3及1.3以上的版本，SunAudio用于Sun的pre-1.3 JVM。对于视频，我们只需要AWT。<BR><BR>　　其结果是本来用于我们的播放器的jar被从1.9 MB压缩到700K。<BR><BR>　　假定你已经编译了两个com.mac.invalidname.spmovie类，把它们添加到定制的jar中：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>jar uf customized.jar com/mac/invalidname/spmovie/*.class</TD></TR></TBODY></TABLE><BR>　　JMF的许可证有效期需要它的readme文件使用任何JMF或者定制子集来分布。我已经在misc目录中提供了，在TinyPlayer的菜单项可以找到它：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>jar uf customized.jar misc/</TD></TR></TBODY></TABLE><BR>　　为了使这个.jar文件可双击，我们提供一个manifest文件告诉Java运行时间在.jar文件中的哪个类中有在双击或者使用简单jar命令行变量的时候调用的main()方法。manifest还提供一个只包含jar自己的类路径：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>Main-Class: com.mac.invalidname.spmovie.TinyPlayer<BR>Class-Path: .</TD></TR></TBODY></TABLE><BR>　　这个manifest使用下面的命令来添加：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>jar ufm customized.jar manifest-stub.txt</TD></TR></TBODY></TABLE><BR>　　这个文件现在有用于播放jar中的一个电影的所有的代码。为了将来之用，请把它保存为spmovie-engine.jar文件，或者类似的文件。<BR><BR>　　现在引擎已经具备了，我们所需要的只有媒体了。正如你可从JMF支持类型页面&lt;http://java.sun.com/products/java-media/jmf/2.1.1/formats.html&gt;看到的那样，所有Java版本的JMF有一个相当有限的所支持解码器的集合。对于视频来说最好的选择可能是H.263，在很广泛的比特率下能够工作的很好，然而它可能在老机器上会执行得很困难，除非你压缩视频或者保持较低的帧速率。虽然音频较少是事先准备好的，但是我想IMA 4:1执行得相当好。适当地编码或者译码你的媒体，并且把它复制为movie/themovie.mov或者movie/themovie.avi。如果你喜欢你也可以把.jar文件改名（我使用spmovie.jar）并且添加媒体：<BR><BR>
<TABLE bgColor=#ffffff width="100%">
<TBODY>
<TR>
<TD>jar u0f spmovie.jar media/</TD></TR></TBODY></TABLE><BR>　　注意这里的"0"是数字零，而不是字母O；这表明我们不想压缩这个输入项，因为我们的媒体已经被压缩了。<BR><BR>　　千辛万苦，我们的自我播放电影终于做成了，这个文件知道在双击的时候运行什么类，提供了多路解编、解码和渲染一部电影所需的所有的代码，以及电影本身。如果你想看看这种小型自我播放电影，你可以去&lt;http://homepage.mac.com/invalidname/spmovie/spmovie-small.jar&gt;看看。<BR><BR>　　它扩展了小应用程序的概念，允许媒体在任何可用于Java的浏览器中播放。<BR><BR>　　说白了，它是一个Java虚拟机而不是媒体播放机。但是我们这种"一次编辑，到处播放"的思想是完全符合Java的原先的目的的。<BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/zuroc/aggbug/2110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-15 20:51 <a href="http://www.blogjava.net/zuroc/archive/2005/03/15/2110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT指南</title><link>http://www.blogjava.net/zuroc/archive/2005/03/13/1984.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Sun, 13 Mar 2005 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/13/1984.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1984.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/13/1984.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1984.html</trackback:ping><description><![CDATA[<!--StartFragment -->&nbsp;1998年，有一位程序员改变了整个Java世界。James Duncan Davidson在试图使用当时的构建工具（GNU Make、批处理文件和shell脚本）来创建一个跨平台的Tomcat构建时，做了多种努力均不能成功。因此，他在从欧洲飞回美国的途中设计出了自己的构建实用工具，并为之命名为Ant，因为这是一个小东西，但却能做大事。James为了解决自己的问题（即创建一个跨平台的构建）而提出的这种快速而简单的解决方案已经演变成Java环境中应用最为广泛的构建管理工具。<BR>如果你在用Java进行开发，而没有使用Ant，那么确实应该拥有这本不算厚的书。Ant是一个可靠的、跨平台的构建工具，它可以充分利用Java环境的优势。Ant本身也是用Java编写的，它可在多个平台（如Unix、Linux以及Windows等等）上工作，因此如果你要转换开发平台，那么学习 Ant是值得的。Ant很容易扩展。在你的工程中，目前是否存在某个需求，而所有Ant功能对此都不能予以满足呢？没有问题！你完全可以像James一样，编写自己的Ant任务。没准儿你也能改变这个世界呢！<BR>以下是使用Ant可以完成的一些工作：<BR>* 定义构建块、它们必须产生的结果以及它们之间的依赖关系<BR>* 自动地由诸如CVS等源代码控制系统获取源代码<BR>* 不仅可令Ant以适当的顺序编译必要的源文件，而且还可生成部署所必需的JAR文件，由此完成应用的构建<BR>* 仅需由一个构建文件（或一组构建文件）即可完成以上所有工作，而构建文件在Ant支持的所有平台上都会有同样的表现<BR>要进行eXtreme（极限）编程吗？Ant就是一个必备工具，利用它可以方便地完成频繁的构建，以此又将有利于使用JUnit和相关技术进行测试驱动的开发。<BR>Ant构建文件是用XML编写的，这是一种良构标准，因此可以确保使用Ant并不需要学习另一种脚本语言。Ant是一个开源工程，这是Apache软件基金会所投资的Jakarta工程的一部分。<BR>“Jesse和Eric可以教你如何使用当前的Ant，他们做得相当棒。这本书提供了颇有深度的信息，对于一些以往从未考虑到的工作，书中还介绍了如何扩展Ant来完成这些工作的详细内容。不论你是偶尔使用Ant，还是需要管理各种大型工程，这都是一本需要持之在手的工具书。”<BR>—James Duncan Davidson，Ant的创造者 <img src ="http://www.blogjava.net/zuroc/aggbug/1984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-13 14:04 <a href="http://www.blogjava.net/zuroc/archive/2005/03/13/1984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Macromedia Flex 教程: Flex入门</title><link>http://www.blogjava.net/zuroc/archive/2005/03/09/1882.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Wed, 09 Mar 2005 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/09/1882.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1882.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/09/1882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1882.html</trackback:ping><description><![CDATA[<P>Macromedia Flex 教程: Flex入门 （1）</P>
<P><STRONG>创建第一个Flex应用程序</STRONG></P>
<P>作者：Robert Crooks (<A href="http://www.macromedia.com/support/training/" target=_blank>Macromedia培训小组</A>)<BR>翻译：MoonFun.qhwa</P>
<P>轉載請註明來自藍色理想</P>
<P>在本教程中，你可以阅读到Flex的简单介绍，还可以利用MXML创建一个简单的分类购物车，从而学习到Macromedia Flex应用程序的基本构成。你将会学到：创建一个应用程序、添加一个布局的容器、添加控件、创建与控件关联的简单数据模型，以及利用ActionScript对事件进行处理。</P>
<P>本文是Robert Crooks编写的四步Flex入门系列的第一部分，Robert Crooks现就职于<A href="http://www.macromedia.com/support/training/" target=_blank>Macromedia客户培训部门</A></P>
<P><A href="http://www.macromedia.com/devnet/flex/articles/calculator.html" target=_blank>Flex 入门 （2）：创建一个Flex计算器<BR></A><A href="http://www.macromedia.com/devnet/flex/articles/containers.html" target=_blank>Flex 入门 （3）：使用容器</A><BR><A href="http://www.macromedia.com/devnet/flex/articles/datamodel.html" target=_blank>Flex 入门 （4）：使用数据模型</A></P>
<P>点击这里下载整个系列教程： <A href="http://www.blueidea.com/articleimg/2004/08/2130/learningflexbasics.zip" target=_blank>Flex入门系列</A>(144KB)</P>
<P>如果你需要更加详细的信息，<A href="http://www.macromedia.com/support/training/" target=_blank>Macromedia客户培训小组</A>提供了为期两天的在线培训课程：《利用Flex开发丰富的互联网应用程序》，教你快速学习Flex应用程序开发。 让我们开始吧！</P>
<P>如果你是一个XML新手，请记住下面的基本规则</P>
<P>如同所有的XML语言一样，在MXML中，标签和属性都是区分大小写的；<BR>所有的属性值必须用双引号(")或单引号(包含<BR></P>
<P><SPAN lang=ZH-CN>所有的标签必须是闭合的。没有子标签的标签可以以斜杠直接结束，而无需额外的结束标签：</SPAN></P>
<P><SPAN lang=EN-US><SPAN class=code><SPAN lang=EN-US>&lt;mx:Label text="Hello"&gt;&lt;/mx:Label&gt;</SPAN></SPAN></SPAN></P>
<P><SPAN lang=ZH-CN>或</SPAN></P>
<P><SPAN lang=EN-US><SPAN class=code><SPAN lang=EN-US>&lt;mx:Label text="Hello"/&gt;</SPAN></SPAN></SPAN></P>
<P><SPAN lang=ZH-CN>如果你是一个</SPAN><SPAN lang=EN-US>ActionScript新手</SPAN><SPAN lang=ZH-CN>，你可以发现它的语法和你熟悉的语言的语法很相近，比如</SPAN><SPAN lang=EN-US>JavaScript</SPAN><SPAN lang=ZH-CN>或者</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN lang=ZH-CN>。请记住这些基本的规则：</SPAN></P>
<P><SPAN lang=EN-US>ActionScript</SPAN><SPAN lang=ZH-CN>是区分大小写的<BR></SPAN><SPAN lang=ZH-CN>语句必须以分号</SPAN><SPAN lang=EN-US>(;)</SPAN><SPAN lang=ZH-CN>结尾</SPAN></P>
<P><SPAN lang=ZH-CN><STRONG>本教程包含的内容：</STRONG></SPAN></P>
<P><SPAN lang=EN-US>1. Flex</SPAN><SPAN lang=ZH-CN>简单介绍<BR></SPAN><SPAN lang=EN-US>2. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Application (</SPAN><SPAN lang=ZH-CN>应用程序</SPAN><SPAN lang=EN-US>)</SPAN><SPAN lang=ZH-CN>标签<BR></SPAN><SPAN lang=EN-US>3. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Panel (</SPAN><SPAN lang=ZH-CN>面板</SPAN><SPAN lang=EN-US>)</SPAN><SPAN lang=ZH-CN>容器<BR></SPAN><SPAN lang=EN-US>4. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Label (</SPAN><SPAN lang=ZH-CN>标签</SPAN><SPAN lang=EN-US>)控件</SPAN><SPAN lang=ZH-CN><BR></SPAN><SPAN lang=EN-US>5. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Text (</SPAN><SPAN lang=ZH-CN>文本</SPAN><SPAN lang=EN-US>)控件</SPAN><SPAN lang=ZH-CN><BR></SPAN><SPAN lang=EN-US>6. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>Button (</SPAN><SPAN lang=ZH-CN>按钮</SPAN><SPAN lang=EN-US>)控件</SPAN><SPAN lang=ZH-CN><BR></SPAN><SPAN lang=EN-US>7. </SPAN><SPAN lang=ZH-CN>如何使用</SPAN><SPAN lang=EN-US>ComboBox (</SPAN><SPAN lang=ZH-CN>下拉列表</SPAN><SPAN lang=EN-US>)控件</SPAN><SPAN lang=ZH-CN><BR></SPAN><SPAN lang=EN-US>8. </SPAN><SPAN lang=ZH-CN>如何创建一个数组对象<BR></SPAN><SPAN lang=EN-US>9. </SPAN><SPAN lang=ZH-CN>如何绑定数据到控件对象<BR></SPAN><SPAN lang=EN-US>10. </SPAN><SPAN lang=ZH-CN>如何用</SPAN><SPAN lang=EN-US>ActionScript</SPAN><SPAN lang=ZH-CN>处理用户事件</SPAN></P>
<P><SPAN lang=ZH-CN><STRONG>准备条件</STRONG>：</SPAN></P>
<P><SPAN lang=ZH-CN>完成本教程必须具备的软件和文件：</SPAN></P>
<P><SPAN lang=EN-US><STRONG>Macriomedia Flex</STRONG></SPAN></P>
<P><SPAN lang=ZH-CN>（可以在</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>支持的平台和服务器上安装运行）试用版的</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>只有光盘供应，请从</SPAN><SPAN lang=EN-US>Macromedia</SPAN><SPAN lang=ZH-CN>销售处购买，售价</SPAN><SPAN lang=EN-US>$8.99. </SPAN><SPAN lang=ZH-CN>试用版的相关信息，请访问</SPAN><SPAN lang=EN-US>: <A class="" href="http://www.macromedia.com/software/flex/productinfo/faq/" target=_blank><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>常见问题</SPAN></A></SPAN></P>
<P><SPAN lang=ZH-CN><A class="" href="http://www.macromedia.com/go/devcenter_flex_try" target=_blank><SPAN lang=ZH-CN><IMG align=absMiddle alt="" border=0 height=16 src="http://www.blueidea.com/articleimg/2004/08/2130/try_icon.gif" width=16>试用</SPAN></A></SPAN><SPAN lang=ZH-CN> <A class="" href="http://www.macromedia.com/go/devcenter_flex_buy" target=_blank><SPAN lang=ZH-CN><IMG align=absMiddle alt="" border=0 height=16 src="http://www.blueidea.com/articleimg/2004/08/2130/buy_icon.gif" width=16></SPAN><SPAN lang=ZH-CN>购买</SPAN></A></SPAN></P>
<P><SPAN lang=EN-US>Dreamweaver MX 2004 </SPAN><SPAN lang=ZH-CN>或其他文本编辑器（例如记事本），用来编辑</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN lang=ZH-CN>和</SPAN><SPAN lang=EN-US>ActionScript</SPAN><SPAN lang=ZH-CN>代码</SPAN></P>
<P><SPAN lang=ZH-CN><A class="" href="http://www.macromedia.com/go/devcenter_dw_try" target=_blank><SPAN lang=ZH-CN><IMG align=absMiddle alt="" border=0 height=16 src="http://www.blueidea.com/articleimg/2004/08/2130/try_icon.gif" width=16>试用</SPAN></A></SPAN><SPAN lang=ZH-CN> <A class="" href="http://www.macromedia.com/go/devcenter_dw_buy" target=_blank><SPAN lang=ZH-CN><IMG align=absMiddle alt="" border=0 height=16 src="http://www.blueidea.com/articleimg/2004/08/2130/buy_icon.gif" width=16></SPAN><SPAN lang=ZH-CN>购买</SPAN></A></SPAN></P>
<P><SPAN lang=ZH-CN><STRONG>准备知识：</STRONG></SPAN></P>
<P><SPAN lang=ZH-CN>阅读</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>简介<BR></SPAN><SPAN lang=ZH-CN>会浏览一个</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN lang=ZH-CN>应用程序<BR><BR><STRONG>Flex 简介</STRONG> </P>
<P>Macromedia Flex 是一个用来创建丰富信息的互联网应用程序的服务器组件。Flex内置的界面可以由Macromeida Flash播放器显示在客户端系统上。Flex的本质是：</P>
<P>
<UL>
<LI>一个描述应用程序界面的XML语言 (MXML) 
<LI>一个ECMA规范的脚本语言(ActionScript)，处理用户和系统的事件，构建复杂的数据模型 
<LI>一个类库 
<LI>运行时的即时服务 
<LI>一个由MXML文件生成SWF文件的编译器</LI></UL>
<P></P>
<P><STRONG>MXML</STRONG></P>
<P>MXML是一种描述Flex應用程序構造的XML1.0语言。每个MXML文件应该以一个XML声明开始：<SPAN class=code>&lt;?xml version="1.0"?&gt;</SPAN></P>
<P>和其他XML语言一样，MXML包含元素（标签）和属性，对大小写敏感。标签名称以大写字母开头，大小写混合，必须有对应的结束标签：<BR><SPAN class=code>&lt;ComboBox&gt;&lt;/ComboBox&gt;</SPAN></P>
<P>也可以这样结束对没有内容的标签：<BR><SPAN class=code>&lt;ComboBox/&gt;</SPAN></P>
<P>属性以小写字母开头，大小写混合。属性必须包含在引号内。<BR><SPAN class=code>&lt;ComboBox id="myCombo"/&gt;</SPAN></P>
<P>除了click或initialize之类的事件之外，所有的属性都被编译器作为文本字符串处理。如果需要绑定数据或者强迫编译器执行表达式，可以将变量的部分用花括号包起来：<BR><SPAN class=code>&lt;ComboBox dataProvider="{myArray}"/&gt;</SPAN></P>
<P>大部分的属性都可以作为子标签：<BR><SPAN class=code>&lt;ComboBox dataProvider="{myArray}"/&gt;</SPAN><BR>等效于：<BR><SPAN class=code>&lt;ComboBox&gt; &lt;dataProvider&gt;{myArray}&lt;/dataProvider&gt; &lt;/ComboBox&gt;</SPAN></P>
<P>描述应用程序的MXML文件必须有一个位于其他元素之外的Application元素：<BR><SPAN class=code>&lt;?xml version="1.0"?&gt;&nbsp; <BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&nbsp; [other elements...]&nbsp; <BR>&lt;/mx:Application&gt;</SPAN></P>
<P>注意xmlns属性，它声明了XML的命名空间。命名空间可以让你在单个文档中使用多重XML语言而避免混淆不同语言中相同的元素名称。这里的":mx"就是一个在特定命名空间中使用的前缀。</P>
<P>注意：这里定义的命名空间是标准的MXML类库，请将它包含在每个MXML文件中。</P>
<P>可以将声明放在任何MXML标签中；声明对该标签嵌套的所有标签有效。本系列教程中都以mx作为MXML类库的前缀。</P>
<P>如需更多信息，<A class="" href="http://livedocs.macromedia.com/flex/" target=_blank>请参阅 Flex语言参考</A></P>
<P><STRONG>ActionScript</STRONG></P>
<P>ActionScript是一种类似JavaScript和其他ECMA规范的面向对象的脚本语言。如果你使用过JavaScript或Java/C#等其他面向对象的语言，你可以发现它们的语法很相似。你可以在MXML文件中嵌入ActionScript代码，也可以从独立的外部文件导入代码。</P>
<P>完整的ActionScript参考： <A class="" href="http://livedocs.macromedia.com/flex/" target=_blank>Action 语言参考</A></P>
<P><BR><STRONG>MXML类库</STRONG></P>
<P>Flex既包含控制和容器等可见的组件，也包括了远程服务对象和数据模型等的不可见组件。你可以在后面的介绍中得到详细的信息。</P>
<P><STRONG>运行时服务</STRONG></P>
<P>Flex提供了多项运行时服务，如：历史控制和远程服务连接对象。以开发的角度看，这些服务都是对类库的调用。</P>
<P><STRONG>编译器</STRONG></P>
<P>Flex编译器会在收到一个浏览器访问MXML文件的请求后，自动编译生成相应的SWF文件。该SWF文件将被缓存，直到你修改了源MXML文件。<BR><BR></P>
<P><STRONG>创建应用程序</STRONG></P>
<P>在这个简单的购物车中，我们显示一个咖啡品牌的列表（类似于HTML的select）。使用数据绑定功能在下面显示当前选择的品牌的说明，还有一个添加到购物车的按钮，当按钮被按下后，该品牌的咖啡便会被添加到购物列表中。</P>
<P align=center><IMG alt="" border=0 height=314 src="http://www.blueidea.com/articleimg/2004/08/2130/fig1.gif" width=212></P>
<P align=center>图1. 教程创建的Flex应用程序</P>
<P>这个教程的目的是为了学习使用：</P>
<P>Application (应用程序)类<BR>Panel (面板)容器<BR>Script (脚本)元素<BR>Array (数组)元素<BR>Object (对象)元素<BR>Label (标签)元素<BR>Text (文本框)元素<BR>Button (按钮)控件<BR>ComboBox (下拉列表)控件<BR>List (列表)控件<BR>一个ActionScript函数</P>
<P><BR><STRONG>创建Application（应用程序）对象</STRONG></P>
<P>任何一个Flex程序都是以XML声明开始和Application标记的。Application标签包含一个MX类库命名空间的声明：xmlns:mx="http://www.macromedia.com/2003/mxml" 。引用该类库的所有标签必须以mx作为前缀。</P>
<P>1. 创建一个新文件 ，然后保存为 firstapp.mxml，位于flex_tutorials目录下<BR>2. 在文件的开始处，插入XML声明：<BR><SPAN class=code>&lt;?xml version="1.0"?&gt;</SPAN><BR>3. 在XML声明后，添加带命名空间的Application标签：<BR><SPAN class=code>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&lt;/mx:Application&gt;</SPAN></P>
<P><STRONG>应用程序布局：添加一个面板</STRONG></P>
<P>通常你可以将Flex应用程序中可见的组件放置于容器中，容器提供了绑定文本、控件、图像和其他媒体类型的元素。在这里，你可以使用称为“面板”(Panel)的容器，它可以提供大部分应用程序需要的全部外壳。你还可以使用面板的title(标题)属性，修改面板上方自动包含着的标题榄的文字。</P>
<P>4. 在Application标签内部，添加一个Panel标签，title属性为"my First Flex App"</P>
<P><SPAN class=code>&lt;mx:Panel title="My First Flex App"&gt;<BR>&lt;/mx:Panel&gt;</SPAN></P>
<P><STRONG>添加一个显示标题的Label元素</STRONG></P>
<P>Label元素可以用来显示单行文本。它有一些属性，这里用到的是text（文本）属性，定义Label显示的内容。</P>
<P>5. 在Panel标签内，插入一个带有文本属性的Label标签，如下：<SPAN class=code>&lt;mx:Label text="Coffee Blends"/&gt;</SPAN></P>
<P>6. 保存文件，预览一下程序</P>
<P><STRONG>添加一个定义咖啡品牌的数组对象</STRONG></P>
<P>本程序的数据模型是一个简单的数组（内容是一系列的对象），你可以直接在程序中用Array和Object元素创建。这里每个数组单元对象都有两个属性：label和data，你可以将这两个属性写成对象的子标签。用这两个属性名称是为了提供给ComboBox和List这样的控件元素使用，稍后我们会介绍。</P>
<P>这些控件元素可以使用更加复杂的数据对象，但是既然现在是手工创建数据模型，我们就使用简单的形式。通常的语法是：</P>
<P><SPAN class=code>&lt;mx:Array id="identifier"&gt;<BR>&nbsp; &lt;mx:Object&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label&gt;literal string&lt;/label&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;data&gt;another literal string&lt;/data&gt;<BR>&nbsp; &lt;/mx:Object&gt;<BR>&lt;/mx:Array&gt;</SPAN></P>
<P>留意这里的ID属性。ID几乎是所有Flex元素都具备的属性，它将元素“贴”上标志以区分其他元素。如果你要在数据绑定或ActionScript中使用这个元素，最好给它指定一个ID。</P>
<P>不可见元素可以由你随意摆放，但是把他们放到程序的首部--即可见元素的前面--是一个好习惯。</P>
<P><SPAN class=code>&lt;mx:Array id="coffeeArray"&gt;<BR>&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&lt;label&gt;Red Sea&lt;/label&gt;<BR>&nbsp;&nbsp;&lt;data&gt;Smooth and fragrant&lt;/data&gt;<BR>&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&lt;label&gt;Andes&lt;/label&gt;<BR>&nbsp;&nbsp;&lt;data&gt;Rich and pungent&lt;/data&gt;<BR>&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&lt;label&gt;Blue Mountain&lt;/label&gt;<BR>&nbsp;&lt;data&gt;Delicate and refined&lt;/data&gt;<BR>&nbsp;&lt;/mx:Object&gt;<BR>&lt;/mx:Array&gt;</SPAN></P>
<P><BR><STRONG>添加一个显示咖啡品牌的ComboBox</STRONG></P>
<P>Flex的ComboBox类似于HTML的select功能，而且更加强大。需显示的数组由dataProvider属性指定。你可以在dataProvider标签中直接创建数组，但是更为常用的方法是在别处创建或导入一个数组，然后在dataProvider处指定：</P>
<P><SPAN class=code>&lt;mx:ComboBox id="myCombo" dataProvider="{myArray}"/&gt;</SPAN></P>
<P>这里的大括号告诉编译器：里面是一个变量或者代求算的变量，而不是字符串。</P>
<P>如果对象包含label和data属性，他们会自动按显示数据（label）和关联数据（data）区分，data可以是简单的值，也可以是复杂的类型（如对象）。如果对象既没有label属性也没有data属性，那么整个对象将作为data属性，而label属性则为由ComboBox的labelField属性指定的对象属性。例如ComboBox的labelField值为"name"，那么label的值就为对象的name属性。</P>
<P>8. 在Label之后添加一个ComboBox，id取为coffeeComb，使用dataProvider属性将CombBox绑定到上一步创建的coffeeArray数组：</P>
<P><SPAN class=code>&lt;mx:ComboBox id="coffeeCombo" dataProvider="{coffeeArray}"/&gt;</SPAN></P>
<P><STRONG>添加一个显示说明的Text(文本)控件</STRONG></P>
<P>Text控件与Label相似，不同的是它可以显示多行数据。这里我们用它来显示ComboBox中选中的咖啡品牌的说明。这里要用到ComboBox中选择的项目的data属性。</P>
<P>9. 在ComboBox之后，添加一个带有text属性的文本控件，将text属性设置为“Description:”然后加上一个到ComboBox选择项目的data属性的绑定：</P>
<P><SPAN class=code>&lt;mx:Text text="Description: {coffeeCombo.selectedItem.data}"/&gt;</SPAN></P>
<P><BR><STRONG>添加一个增加咖啡品牌到购物栏的按钮</STRONG></P>
<P>Button控件很简单。它有一个label的属性来设置显示的文字，还有一个click事件，用来指定鼠标点击事件的处理动作。</P>
<P>在这里，我们添加一个按钮，通过调用一个addToCart函数，把ComboBox中选择的项目添加到购物栏中。我们将在后面创建这个函数。</P>
<P>10. 添加一个显示“Add to Cart”的按钮，被点击后调用addToCart函数：</P>
<P><SPAN class=code>&lt;mx:Button label="Add to Cart" click="addToCart()"/&gt;</SPAN></P>
<P><STRONG>给购物车添加一个List（列表）控件</STRONG></P>
<P>List控件和ComboBox唯一的区别是它能同时显示和选择多条项目。这里用的List不需要指定dataProvider属性了，因为它在用户添加数据前是空的。</P>
<P>11. 在按钮之后，添加一个List控件，id取为cart:</P>
<P><SPAN class=code>&lt;mx:List id="cart"/&gt;</SPAN></P>
<P>添加一段处理按钮点击事件的脚本</P>
<P>教程的最后一步是添加一段ActionScript脚本，用来处理按钮的点击事件。在这个简单的应用程序中，我们在Script标签中添加脚本。</P>
<P>Script标签中的ActionScript代码将被包含在 &lt;![CDATA[&nbsp; ]]&gt; 里面，这个标志里面的内容不被XML解析器解析。这个是标准的XML用法，在这里是为了保护ActionScript的一些可能会被XML解析器误处理的一些字符（如&lt;等），实际上这样不仅保护了这些字符，也省去了XML解析器解析ActionScript内容。</P>
<P>这里用到的ActionScript语法很简单，函数的通常语法是：</P>
<P><SPAN class=code>function 函数名(参数1:数据类型...):返回数据类型<BR>{<BR>&nbsp;[ActionScript 语句]<BR>}</SPAN></P>
<P>在addToCart函数中，使用List类的addItem方法添加项目。该方法需要有label参数和data参数，这些参数正好是ComboBox中选中的项目的label属性和data属性。</P>
<P>12. 在Array标签之后，插入一个带有CDATA包装的Script标签：</P>
<P><SPAN class=code>&lt;mx:Script&gt;<BR>&nbsp;&nbsp;&lt;![CDATA[]]&gt;<BR>&lt;/mx:Script&gt;</SPAN></P>
<P>13. 在CDATA里面，添加一个名为addToCart不返回任何值的函数：</P>
<P><SPAN class=code>function addToCart():Void<BR>{<BR>}</SPAN></P>
<P><BR>14. 在函数体内部，使用List类的addItem方法将ComboBox中所选项目label属性和data属性添加到List上。</P>
<P><SPAN class=code>cart.addItem(coffeeCombo.selectedItem.label,coffeeCombo.selectedItem.data);</SPAN></P>
<P>15. 保存文件，在浏览器中预览应用程序 （查看浏览MXML文件的方法见第一页）</P>
<P><BR><SPAN class="">&nbsp;</P>
<P>firstapp.mxml完整的代码：</P>
<P><SPAN class=code>&lt;?xml version="1.0"?&gt;<BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml" &gt;<BR>&nbsp;&lt;!-- data model --&gt;<BR>&nbsp;&lt;mx:Array id="coffeeArray"&gt;<BR>&nbsp;&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;label&gt;Red Sea&lt;/label&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;data&gt;Smooth and fragrant&lt;/data&gt;<BR>&nbsp;&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;label&gt;Andes&lt;/label&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;data&gt;Rich and pungent&lt;/data&gt;<BR>&nbsp;&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&nbsp;&lt;mx:Object&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;label&gt;Blue Mountain&lt;/label&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;data&gt;Delicate and refined&lt;/data&gt;<BR>&nbsp;&nbsp;&lt;/mx:Object&gt;<BR>&nbsp;&lt;/mx:Array&gt;<BR>&nbsp;&lt;mx:Script&gt;<BR>&nbsp;&nbsp;&lt;![CDATA[<BR>&nbsp;&nbsp;&nbsp;function addToCart():Void<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;cart.addItem(coffeeCombo.selectedItem.label,coffeeCombo.selectedItem.data);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;]]&gt;<BR>&nbsp;&lt;/mx:Script&gt;<BR>&nbsp;&lt;!-- view --&gt;<BR>&nbsp;&lt;mx:Panel title="My First Flex App"&gt;<BR>&nbsp;&nbsp;&lt;mx:Label text="Coffee Blends"/&gt;<BR>&nbsp;&nbsp;&lt;mx:ComboBox id="coffeeCombo" dataProvider="{coffeeArray}"/&gt;<BR>&nbsp;&nbsp;&lt;mx:Text text="Description: {coffeeCombo.selectedItem.data}"/&gt;<BR>&nbsp;&nbsp;&lt;mx:Button label="Add to Cart" click="addToCart()"/&gt;<BR>&nbsp;&nbsp;&lt;mx:List id="cart"/&gt;<BR>&nbsp;&lt;/mx:Panel&gt;<BR>&lt;/mx:Application&gt;</SPAN></P>
<P></SPAN></P>
<P><BR><STRONG>进一步学习</STRONG></P>
<P>在这个简单的例子中，我们学习了Flex的一些核心元素：容器、控件、数据模型、数据绑定和事件处理。你可以继续看本系列教程：</P>
<P><A class="" href="http://www.macromedia.com/devnet/flex/articles/calculator.html" target=_blank>Flex 入门 （2）：创建一个Flex计算器</A><BR><A class="" href="http://www.macromedia.com/devnet/flex/articles/containers.html" target=_blank>Flex 入门 （3）：使用容器<BR></A><A class="" href="http://www.macromedia.com/devnet/flex/articles/datamodel.html" target=_blank>Flex 入门 （4）：使用数据模型</A></P>
<P>你也可以下載整个教程：<A class="" href="http://www.blueidea.com/articleimg/2004/08/2130/learningflexbasics.zip" target=_blank>Flex入门(1-4)</A>。<BR></P></SPAN><img src ="http://www.blogjava.net/zuroc/aggbug/1882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-09 17:36 <a href="http://www.blogjava.net/zuroc/archive/2005/03/09/1882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Macromedia Flex 标记语言简介 </title><link>http://www.blogjava.net/zuroc/archive/2005/03/09/1881.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Wed, 09 Mar 2005 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/09/1881.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1881.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/09/1881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1881.html</trackback:ping><description><![CDATA[<P><FONT color=#ff0000>[原作]</FONT><A class="" href="http://www.macromedia.com/devnet/flex/articles/paradigm.html" target=_blank><FONT color=#ff0000>http://www.macromedia.com/devnet/flex/articles/paradigm.html</FONT></A><BR><FONT color=#ff0000>[翻译]</FONT><A class="" href="http://samhoo.blogbus.com/" target=_blank><FONT color=#ff0000>samhoo</FONT></A><FONT color=#ff0000>（</FONT><A href="mailto:samhoophone@yahoo.com"><FONT color=#ff0000>samhoophone@yahoo.com</FONT></A><FONT color=#ff0000>）<BR>[注]转载请保持全文完整</FONT></P>
<P><BR>Macromedia Flex(开发代号为Royale)是一个展现服务器，开发者可以用它来开发新一代的“复杂Internet应用”(RIAs - Rich Internet Applications)。复杂Internet应用融合了桌面应用的可用性和web应用的易于管理的优点。</P>
<P>Flex是一个在J2EE应用服务器或servlet容器安装的展现服务器。它拥有丰富的用户界面组件、用于排布这些组件的基于XML的标记语言，以及可以处理用户交互的面向对象编程语言。这些技术的给我们带来的是：使用Flash播放器渲染复杂Internet应用，使用工业标准和开发者熟悉的方式进行开发。</P>
<P>本文将专注于Flex语言的关键部分。</P>
<P>为了运行本文中提到的代码，你可能需要加入Flex的Beta测试。Flex运行于象Macromedia JRun, IBM Websphere, BEA WebLogic, or Apache Tomcat 这样的J2EE应用服务器之上。Flex未来将支持Microsoft .NET服务器。</P>
<P><BR><STRONG>Flex 语言简介</STRONG></P>
<P>由于标记语言和面向对象程序设计语言广泛应用，因此，基于这两项技术的Flex语言也将从中获益。标记语言是成功的，排布用户界面也相对容易。MXML，由Flex引入的、基于XML的标记语言，将延续其成功。和HTML很象，你可以用MXML来排布应用的用户界面。同为基于XML的标记语言，MXML比HTML有更强的结构，更少的语法歧义。比起HTML，MXML还引入了更丰富的标签集。如：DataGrid，Tree，TabNavigator，Accordion和Menu，这些都是标准标签集中的一部分。你还可以扩展MXML标签，创建自己的组件。此外，二者最大的区别是，MXML定义的用户界面是用Flash播放器运行的，相对传统的基于HTML、页面为中心的web应用而言，这将更具吸引力。</P>
<P>除了排布可视组件，还可以用MXML来定义应用中其他重要方面，如，可以把应用定义为一个web服务的客户，或是在应用中开发动画，用于提示用户进度。</P>
<P>但是，标记语言提供的编程逻辑仍难以满足用户交互的需求。在Flex中，可以用ActionScript编程语言来编写事件监听器来满足此种需求。ActionScript是一种基于ECMA-262标准的、强类型的面向对象语言，和其他编程语言——java和C#很相似，因此也很易于上手。</P>
<P>总而言之，当编写一个Flex的应用时，需要用MXML来设置用户界面，并用ActionScript来编写响应用户交互的逻辑。</P>
<P>作为一个开发者，你可以根据自己的喜好，用自己所熟悉的IDE（比如Eclipes或Intellij）手工编写MXML，也可以使用Flex支持的“所见即所得”开发环境（目前开发代号为Brady）。即使你选择手工编写MXML，仍可使用Flex提供的XML schema，在IDE中为你提供代码提示（code hinting）和代码自动填充（code completion）的功能.</P>
<P>下面例子是一个名为HelloWord.mxml的简单Flex应用的源代码。该应用程序有两个TextInput组件，当点击Copy时，source TextInput的内容就会显示在destination TextInput域中。以下例子显示如何用MXML和ActionScript来创建应用：用MXML定义用户界面，再用ActionScript为Button组件的事件监听器编写拷贝逻辑。</P>
<P><SPAN class=code></P>
<P>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;<BR>&nbsp;<BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&nbsp;<BR>&lt;mx:TextInput id="source" width="100"/&gt;<BR>&lt;mx:Button label="Copy" click="destination.text=source.text"/&gt;<BR>&lt;mx:TextInput id="destination" width="100"/&gt;<BR>&nbsp;<BR>&lt;/mx:Application&gt;</P>
<P></SPAN></P>
<P align=center><A class="" href="http://www.blueidea.com/articleimg/2004/09/2165/flex_01.gif" target=_blank><IMG alt="" border=0 height=252 src="http://www.blueidea.com/articleimg/2004/09/2165/flex_01s.gif" width=450></A></P>
<P><BR><STRONG>图1.</STRONG>在HelloWorld程序中将source TextInput的文本拷贝到destination TextInput。</P>
<P><BR><STRONG>Flex开发与部署模型</STRONG></P>
<P>要开发并部署这个应用，一般要经过以下步骤：<BR>1. 用你熟悉的IDE或Flex的“所见即所得”开发工具编写HelloWold.mxml文件。<BR>2. 把该文件部署到应用服务器上。一般可以通过拷贝HelloWorld.mxml到某个web应用的目录下，或将HelloWorld.mxml作为应用的一部分打包到WAR文件中去。</P>
<P>当一个用户首次请求HelloWorld.mxml的时候，服务器会将MXML代码编译为Flash字节码（一个SWF文件）。然后服务器将产生的SWF文件发往客户端，让Flash播放器执行。对同一个MXML文档的并发请求，服务器将跳过编译过程，直接返回相同的编译结果。</P>
<P>如果你对JavaServer Pages比较熟悉，就会发现它们的模型非常相似。就像JSPs被编译为Java字节码(servlets)一样，MXML文件将被编译为Flash字节码。二者的主要不同在于：在Flex中，产生的字节码是在客户端执行的，而由JSP产生的Java字节码（servlet）是在服务器端执行的。通过Flex，你可以将复杂客户端应用无缝的集成到已有的商业逻辑中。</P>
<P><STRONG>使用MXML用户界面组件</STRONG></P>
<P>拥有丰富的用户组件是Flex的一大特色。除了传统的数据输入控件（Text InputTextArea，CheckBox，RadioButton，ComboBox等等），MXML还包括了一些高级组件，用于维护结构化数据（Tree 组件）和大数据集（DataGrid 组件）。为了清晰的组织数据及其处理过程，Flex还提供了导航组件（Tab，ViewStack，Accordion等等）。</P>
<P>为了更易于组织用户界面，Flex容器还定义了布局管理策略，用于指明一个组件相对与另一个组件的位置。Flex组件库提供了大量的、可实现不同布局策略的容器。比如，在HBox中的组件将被水平排列，而在VBox中的组件会被垂直排列，而在Grid中组件将以行列的方式进行排列，就象HTML的table一样。View容器中没有定义任何布局管理策略，因此你可以用x，y坐标来指定组件的位置。</P>
<P>下面给出一个在Flex环境下、具有三个面板的传统e-mail界面。HBox容器中的Tree是水平排列的，而VBox容器中的DataGrid和TextArea则是垂直排列的。</P>
<P><SPAN class=code>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;<BR>&nbsp;<BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&nbsp;<BR>&lt;mx:HBox&gt;<BR>&lt;mx:Tree/&gt;<BR>&lt;mx:VBox&gt;<BR>&lt;mx:DataGrid/&gt;<BR>&lt;mx:TextArea/&gt;<BR>&lt;/mx:VBox&gt;<BR>&lt;/mx:HBox&gt;<BR>&nbsp;<BR>&lt;/mx:Application&gt;</SPAN></P>
<P align=center><A class="" href="http://www.blueidea.com/articleimg/2004/09/2165/flex_02.gif" target=_blank><IMG alt="" border=0 height=279 src="http://www.blueidea.com/articleimg/2004/09/2165/flex_02s.gif" width=450></A></P>
<P><STRONG>图2. </STRONG>一个用Flex创建的e-mail应用。</P>
<P><BR><STRONG>编写ActionScript代码</STRONG></P>
<P>Flex语言是事件驱动的。MXML将事件作为标签的属性，你可以为它编写事件监听器。比如，Button组件有一个click属性，ComboBox，List和Tree组件有一个change属性，等等。</P>
<P>对于简单的交互，可以在标签的事件属性上直接编写ActionScript语句。例如，在HelloWorld应用中，存在Button的click事件监听器中的ActionScripts语句，能把source TextInput 的内容拷贝到destination TextInput中。</P>
<P><SPAN class=code></P>
<P>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;<BR>&nbsp;<BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&nbsp;<BR>&lt;mx:TextInput id="source" width="100"/&gt;<BR>&lt;mx:Button label="Copy" click="destination.text=source.text"/&gt;<BR>&lt;mx:TextInput id="destination" width="100"/&gt;<BR>&nbsp;<BR>&lt;/mx:Application&gt;</P>
<P></SPAN></P>
<P>当逻辑更为复杂的时候，可以定义独立的ActionScript函数，然后在组件的事件监听器中调用。例如，你可以象下面一样，重写HelloWorld应用：</P>
<P><SPAN class=code></P>
<P>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;<BR>&nbsp;<BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&nbsp;<BR>&lt;mx:script&gt;<BR>&nbsp;<BR>function copy() {<BR>destination.text=source.text<BR>}<BR>&nbsp;<BR>&lt;/mx:script&gt;<BR>&nbsp;<BR>&nbsp;<BR>&lt;mx:TextInput id="source" width="100"/&gt;<BR>&lt;mx:Button label="Copy" click="copy()"/&gt;<BR>&lt;mx:TextInput id="destination" width="100"/&gt;<BR>&nbsp;<BR>&lt;/mx:Application&gt;</P>
<P></SPAN></P>
<P>创建一个MXML文件，实际上是创建了一个类。定义在&lt;mx:script&gt;标签中的ActionScript函数是该类的方法。你可以在MXML文件或独立的文件中定义ActionScript函数。选择哪种方法，取决你所在的组织，后一种方法可以对开发团队进行更好的分工。</P>
<P><STRONG>定义自己的组件</STRONG></P>
<P>在Flex中，你可以从头开始，或通过扩展Flex组件库中已有的组件，来创建自己的组件。创建组件就象创建一个应用一样：用MXML排布用户界面，用ActionScript编写用界面逻辑。</P>
<P>下面的一个例子是，通过扩展VBox类来创建简单的信用卡选择组件。</P>
<P><SPAN class=code>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;<BR>&nbsp;<BR>&lt;mx:VBox xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&nbsp;<BR>&lt;mx:RadioButton groupName="card" id="americanExpress"<BR>label="American Express" selected="true"/&gt;<BR>&lt;mx:RadioButton groupName="card" id="masterCard" label="MasterCard"/&gt;<BR>&lt;mx:RadioButton groupName="card" id="visa" label="Visa"/&gt;<BR>&nbsp;<BR>&lt;/mx:VBox&gt;</SPAN></P>
<P>组件的名字就是源文件的名字。如，源文件的名字是CreditCardChooser.mxml，组件的名字就是CreditCardChooser，这样，这个标签名就可以用了。下面的例子就用上了刚才创建的CreditCardChoose组件。</P>
<P><SPAN class=code></P>
<P>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;<BR>&nbsp;<BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&nbsp;<BR>&lt;mx:Label text="Select a credit card:"/&gt;<BR>&lt;CreditCardChooser/&gt;<BR>&nbsp;<BR>&lt;/mx:Application&gt;</P>
<P><BR>&nbsp;</P>
<P></SPAN></P>
<P align=center><A class="" href="http://www.blueidea.com/articleimg/2004/09/2165/flex_03.gif" target=_blank><IMG alt="" border=0 height=247 src="http://www.blueidea.com/articleimg/2004/09/2165/flex_03s.gif" width=450></A></P>
<P><STRONG>图3. </STRONG>CreditCardChooser应用</P>
<P>界面开发者还能在Macromedia Flash开发环境中创建复杂的可视化组件，并存为SWC文件。</P>
<P>当然，也可以只用ActionScript定义来整个组件，这种方法一般用于定义应用中的非可视组件。你可能会为这样商业对象创建非可视组件——例如，包含客户端逻辑的购物车，或是应用中helper类。<BR></P>
<P><STRONG>数据访问</STRONG></P>
<P>Macromedia Flex为面向服务器架构（SOA – service-oriented architecture）而开发。在这一模型中，应用通过与分散在不同地方的服务进行交互，来完成自己的任务。例如，如果创建一个在线旅行应用，你需要与不同的服务进行交互：全球旅馆预定服务，目的信息服务，天气服务等等。这些服务可能以不同的机制来提供，并且来自不同的地方。Flex使你能在客户端汇集信息，并提供三种不同的数据服务组件，以满足对服务提供者进行特定数据访问的需求：WebService组件，HTTPService组件（一般使用XML通过HTTP进行数据访问）以及RemoteObject组件。MXML允许你用相应的WebService, HTTPService, and RemoteObject标签来设置与服务的连接。<BR>　</P>
<P><STRONG>数据绑定</STRONG></P>
<P>在许多语言中，如何在用户界面控件中显示后台数据，是件令人头疼的事情，而且非常容易出错。收集用户在控件中输入的数据，并传给远程服务也常常是件乏味的事情。</P>
<P>Flex的特色之一，就是提供了双向的数据绑定机制：你可以将用户界面控件绑定到服务调用的数据结果集上，反过来，也可以将服务的参数绑定到用户界面控件输入的值上。</P>
<P>下面是一个简单的股票报价应用。例子使用了WebService标签来设置与XMMethods提供的股价web服务进行连接。这个例子阐明了Flex的双向绑定功能。getQuote方法的symbol输入参数被绑定到symbol TextInput组件上。quote标签被绑定到getQute方法的调用结果上。</P>
<P><SPAN class=code>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;<BR>&nbsp;<BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&nbsp;<BR>&lt;mx:WebService id="wsStock"<BR>wsdl="http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl"&gt;<BR>&nbsp;<BR>&lt;mx:operation name="getQuote"&gt;<BR>&lt;mx:request&gt;<BR>&lt;symbol&gt;{symbol.text}&lt;/symbol&gt;<BR>&lt;/mx:request&gt;<BR>&lt;/mx:operation&gt;<BR>&lt;/mx:WebService&gt;<BR>&nbsp;<BR>&lt;mx:Label text="Enter a symbol:"/&gt;<BR>&lt;mx:HBox&gt;<BR>&lt;mx:TextInput id="symbol"/&gt;<BR>&lt;mx:Button label="Get Quote" click='wsStock.getQuote.send()'/&gt;<BR>&lt;/mx:HBox&gt;<BR>&nbsp;<BR>&lt;mx:Label id="quote" fontWeight="bold"&gt;{wsStock.getQuote.result}&lt;/mx:Label&gt;<BR>&nbsp;<BR>&lt;/mx:Application&gt;</SPAN> 
<P align=center><IMG alt="" border=0 height=281 src="http://www.blueidea.com/articleimg/2004/09/2165/flex_04.gif" width=459></P>
<P><STRONG>图4.</STRONG>股价应用 <BR>实际上，Flex数据绑定机制比传统的重取/显示（retrieve/display）方式更胜一筹：在Flex应用中，你可以将任意对象的任意属性绑定到另一任意对象的任意属性值上。 </P>
<P><STRONG>使用层级样式表（CSS）</STRONG></P>
<P>Flex使用层级样式表标准来保证用户界面的一致性，并使应用更易于维护。就像在HTML中一样，你可以在应用中嵌入一个指向外部的样式表，或在特定的标记元素下将某种风格定义为其属性。样式表还允许定义字体。所需字体定义内嵌于应用的字节码中，即使用户的机器上没有这样的字体，也能被正确的渲染出来。</P>
<P><BR>下面是一个名为main.css的外部样式表。</P>
<P><SPAN class=code></P>
<P>@font-face {</P>
<P>src: url("LucidaSansRegular.ttf");</P>
<P>font-family: mainFont;</P>
<P>}</P>
<P>.error {</P>
<P>color: #FF0000;</P>
<P>font-size: 12;</P>
<P>}</P>
<P>.title {</P>
<P>font-family: mainFontBold;</P>
<P>font-size: 18;</P>
<P>}<BR>　</P>
<P>TextArea {</P>
<P>backgroundColor: #EEF5EE;</P>
<P>}</P>
<P></SPAN></P>
<P>下面的例子通过使用&lt;mx:style&gt;标签声明了一个外部样式表，并对不同的控件使用了不同的样式。</P>
<P><SPAN class=code></P>
<P>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;</P>
<P>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;</P>
<P>&nbsp;</P>
<P>&lt;mx:style src="main.css"/&gt;</P>
<P>&lt;mx:Label styleName="error" text="This is an error"/&gt;</P>
<P>&lt;mx:Label styleName="title" text="This is a title"/&gt;</P>
<P>&lt;mx:TextArea width="200" height="100" wordWrap="true"&gt;</P>
<P>This is a TextArea</P>
<P>&lt;/mx:TextArea&gt;</P>
<P>&nbsp;</P>
<P>&lt;/mx:Application&gt;</P>
<P></SPAN></P>
<P align=center><IMG alt="" border=0 height=344 src="http://www.blueidea.com/articleimg/2004/09/2165/flex_05.gif" width=454></P>
<P><STRONG>图5.</STRONG>使用外部样式表的应用</P>
<P><STRONG>特效</STRONG></P>
<P>复杂Internet应用常常被拿来和客户/服务器应用进行比较。因为它们提供了同一级别的用户体验。但是，容易忽视的区别是，两者的用户各具特点。使用客户/服务器应用的客户通常是备受折磨后，最终适应了他们需要面对的用户界面。而复杂Internet应用的客户通常是临时性的用户。在这样的条件下，一个不直观的用户界面将会丧失机会。</P>
<P>适当的使用特效，如浮动提示和进度状态，有助于客户直观的了解当前内容。在MXML中，你可以通过设置动画达到这一目的。</P>
<P>下面的例子使用了Flex特性库中的prebuilt特效，在这个例子中，当square组件显示时，使用WipeRight特效，而消失时则使用了WipeLeft特效。</P>
<P><SPAN class=code></P>
<P>&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;<BR>&lt;mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"&gt;<BR>&lt;mx:View id="square" width="100" height="100" backgroundColor="#666699" showEffect="WipeRight" hideEffect="WipeLeft"/&gt;</P>
<P>&lt;mx:HBox&gt;<BR>&lt;mx:Button label="Display" click="square.visible=true"/&gt;<BR>&lt;mx:Button label="Hide" click="square.visible=false"/&gt;<BR>&lt;/mx:HBox&gt;<BR>&lt;/mx:Application&gt;</P>
<P></SPAN></P>
<P><BR><STRONG>总结</STRONG></P>
<P>Flex语言包含了一个丰富的用户界面组件库，MXML（一种基于XML的标记语言）和ActionScript（基于ECMA 262的、强类型面向对象编程语言）。MXML用于排布用户界面和处理应用中其他方面的问题，而ActionScript用来处理用户交互逻辑。由于Flash平台的普及，Flex使开发者可以开发广泛的应用程序。开发者可以使用工业标准（如XML，CSS和SVC）和他们所熟悉的模式和范例来创建应用。Flex的分离协作方式和Macromedia公用组件模型也使得开发者和界面设计者能更好的进行协作，在可靠的、易于维护的架构上生产出在用户体验方面有突破性的产品。</P>
<P><STRONG>关于作者</STRONG></P>
<P>从1994-2000年，Christophe Coenraets 服务于Powersoft公司，该公司现在已被Sybase并购。他用Java工作始于1996年，并成为公司Java and Internet Application 部门的技术专员。Christophe后来加入Macromedia公司成为公司J2EE应用服务器JRun的技术专员。Christophe在这一职位上开始研究复杂Internet应用，着手将Flash前端与J2EE后端进行集成，Christophe目前是Macromedia的 new developer-centric Rich Internet Applications initiative的高级专员。过去的十年间，Christophe经常在全球范围的研讨会中发言。</P><img src ="http://www.blogjava.net/zuroc/aggbug/1881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-09 17:24 <a href="http://www.blogjava.net/zuroc/archive/2005/03/09/1881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex的参考资料(转载)</title><link>http://www.blogjava.net/zuroc/archive/2005/03/09/1880.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Wed, 09 Mar 2005 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/09/1880.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1880.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/09/1880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1880.html</trackback:ping><description><![CDATA[<DIV class=post>
<DIV class=postcontent>
<DIV class=diaryContent id=diary0 style="DISPLAY: block">
<DIV>
<H2><A href="http://www.macromedia.com/cn/software/flex/productinfo/brz_overview/"><FONT size=3>http://www.macromedia.com/cn/software/flex/productinfo/brz_overview/</FONT></A><A href="http://www.macromedia.com/cn/software/flex/productinfo/brz_overview/" target=_blank><BR></A><FONT size=3>讲述Flex的时代背景、应用环境和工作流程原理，附带FlexStore的样例介绍，非常值得阅读。<BR>中文版：中文ppt和中文解说</FONT></H2></DIV>
<DIV>&nbsp;A. 入门文档：国内的文章比较难找，都是一些基础的应用。论坛与ＱＱ群也是少有人回复。所以建议直接从ＭＭ的官方网站上下载参考手册：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<A href="http://www.macromedia.com/support/documentation/en/flex/"><U>http://www.macromedia.com/support/documentation/en/flex/</U></A> </DIV>
<DIV>&nbsp;&nbsp;B. 提高文档：依然只有MM开发者网站上的东西值得学习：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A href="http://www.macromedia.com/devnet/flex/">http://www.macromedia.com/devnet/flex/</A> </DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同事语，看完<A href="http://www.macromedia.com/devnet/flex/best_practices.html"><U>Best Practices</U></A>&nbsp; ，对Flex有了新的认识，里面的Sample都是很好。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同时 <A href="http://www.macromedia.com/go/cc" target=mm_window><U>Christophe Coenraets</U></A>&nbsp;和<A href="http://www.macromedia.com/go/mchotinblog" target=mm_window><U>Matt Chotin</U></A>的blog也应该经常阅读<BR>&nbsp;<BR></DIV></DIV></DIV></DIV><img src ="http://www.blogjava.net/zuroc/aggbug/1880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-09 16:56 <a href="http://www.blogjava.net/zuroc/archive/2005/03/09/1880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于跨平台的Java应用程序界面选择的困惑。</title><link>http://www.blogjava.net/zuroc/archive/2005/03/09/1872.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Wed, 09 Mar 2005 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/09/1872.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1872.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/09/1872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1872.html</trackback:ping><description><![CDATA[Eclipse有<FONT color=#770000>SWT（见</FONT><A id=viewpost1_TitleUrl HREF="/zuroc/archive/2005/03/08/1823.html"><FONT color=#770000>AWT 和 SWING 的强大竞争者：SWT 简介</FONT></A><FONT color=#770000>）<BR></FONT><FONT color=#000000>Mozilla有XUL （<FONT color=#770000>见</FONT><A id=_456135b82d28d9e_HomePageDays_DaysList__ctl4_DayItem_DayList__ctl8_TitleUrl HREF="/zuroc/archive/2005/03/04/1691.html">关注的文章</A>）（我不知道是不是可以用在JAVA程序上，希望高手指点）<BR>Flash 界面有Flex/Laszlo（<FONT color=#770000>见</FONT><A id=_456135b82d28d9e_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl4_TitleUrl HREF="/zuroc/archive/2005/03/09/1868.html"><FONT color=#770000>程序界面：Laszlo平台简介</FONT></A>&nbsp;，<A class=result_url href="http://www.macromedia.com/go/gnavtray_flex_home_cn" target=_blank><FONT color=#3737c8>Macromedia - </FONT><FONT color=#cc0033>Flex</FONT></A>）<BR>他们是否可以同时应用于一个程序，比如</FONT><FONT color=#770000>SWT中内嵌</FONT><FONT color=#000000>Flash 界面的窗体。若可行，Java应用程序界面将是多丰富。</FONT><img src ="http://www.blogjava.net/zuroc/aggbug/1872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-09 13:07 <a href="http://www.blogjava.net/zuroc/archive/2005/03/09/1872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RIA(Rich Internet Application) 介绍     选择自 Caviler 的 Blog  </title><link>http://www.blogjava.net/zuroc/archive/2005/03/09/1870.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Wed, 09 Mar 2005 04:31:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/09/1870.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1870.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/09/1870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1870.html</trackback:ping><description><![CDATA[<TABLE cellPadding=4 width="100%" border=0>
<TBODY>
<TR>
<TD height=19></TD></TR>
<TR>
<TD width=10></TD>
<TD><SPAN id=ArticleContent1_ArticleContent1_lblContent>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">依我个人的理解，</SPAN><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</SPAN><SPAN lang=EN-US>Rich Internet Application</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，富互联网应用系统）即一个充分强大的用户端浏览器，这个浏览器可以是</SPAN> <B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>IE(XAML)</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>Mozilla FireFox(XUL)</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>Flash(Flex) </SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等等，说穿了，也就是一个</SPAN> <SPAN lang=EN-US>HTML </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的升级而已，和</SPAN> <SPAN lang=EN-US>ASP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>JSP </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产生</SPAN><SPAN lang=EN-US>HTML </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">供客户端浏览一样，你也可能需要各种各样的工具去产生静态的或动态的这些浏览器可以使用的脚本。不管怎么说，这是一个迫切的、必要的趋势！</SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以下文章来自</SPAN> <SPAN lang=EN-US>Oracle </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的杂志</SPAN> <B style="mso-bidi-font-weight: normal"><I><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者：</SPAN><SPAN lang=EN-US>Cameron O'Rourke</SPAN></I></B><I><SPAN lang=EN-US> </SPAN></I></P>
<P class=MsoNormal style="MARGIN: 0pt 0pt 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">1.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么是用</SPAN><SPAN lang=EN-US>RIA</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">？</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</SPAN><SPAN lang=EN-US>Rich Internet Application</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，富互联网应用系统）技术允许我们在因特网上以一种象使用</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一样简单的方式来部署富客户端程序。这是一个用户接口，它比用</SPAN><SPAN lang=EN-US>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">能实现的接口更加健壮、反应更加灵敏和更具有令人感兴趣的可视化特性。无论将来</SPAN><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否能够如人们所猜测的那样完全代替</SPAN><SPAN lang=EN-US>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用系统，对于那些采用胖客户端技术运行复杂应用系统的机构来说，</SPAN><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">确实提供了一种廉价的选择。</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt 0pt 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为什么用</SPAN><SPAN lang=EN-US>RIA</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">？</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于</SPAN><SPAN lang=EN-US>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的应用程序之所以变得流行是由于应用系统的部署成本低、结构简单，且</SPAN><SPAN lang=EN-US>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">易于学习和使用。很多用户和开发人员都乐于放弃由桌面计算机带来的用户界面改进，来实现对新数据和应用系统的快速访问。与丧失一些重要的</SPAN><SPAN lang=EN-US>UI</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">功能相比，基于</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式所带来的好处要更大得多。</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然而，某些应用系统并不完全适合采用</SPAN><SPAN lang=EN-US>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术。复杂的应用系统可能要求多次提取网页来完成一项事务处理，在某些领域中，如医药和财务领域，这往往导致交互速度低得无法接受。让我考虑一个项目管理系统：我们可以将其实现为一个</SPAN><SPAN lang=EN-US>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用系统，但是如果用户可以看到并且操作图表、进度表和各种层次结构，那么显然会工作得更好。</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">此外，虽然</SPAN><SPAN lang=EN-US>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始走向简单，但是即使简单的交互活动也仍然需要用很多的脚本来完成。即使一个输入窗体经过仔细的布置和全面的脚本设计，它从浏览器所能发送的也仅仅是简单的</SPAN><SPAN lang=EN-US>"</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名字</SPAN><SPAN lang=EN-US>/</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">值</SPAN><SPAN lang=EN-US>"</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对。如果一个</SPAN><SPAN lang=EN-US>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">窗体能够以</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文档形式发送和接收更复杂的数据结构，那就好多了。</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">利用相对健壮的客户端描述引擎，这个引擎能够提供内容密集、响应速度快和图形丰富的用户界面。除了提供一个具有各种控件（滑标、日期选择器、窗口、选项卡、微调控制器和标尺等）的界面之外，</SPAN><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般还允许使用</SPAN><SPAN lang=EN-US>SVG</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</SPAN><SPAN lang=EN-US>Scalable Vector Graphics</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可伸缩向量图）或其他技术来随时构建图形。一些</SPAN><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术甚至能够提供全活动的动画来对数据变化作出响应。</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的另一个好处在于，数据能够被缓存在客户端，从而可以实现一个比基于</SPAN><SPAN lang=EN-US>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的响应速度更快且数据往返于服务器的次数更少的用户界面。对于无线设备和需要偶尔连接的设备来说，将来的趋势肯定是向富客户端的方向发展，并且会逐渐远离基于文本的</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户端。那些运行在膝上设备上的应用系统，可以被设计成以离线方式工作，或者至少当连接丢失的时候能基本上以离线的方式工作。</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图</SPAN><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">给出了一个典型的</SPAN><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">体系结构。</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常被用作数据传输的格式，有时也被用来描述窗体的布局。在很多的实例中，客户端可以保持与数据源的连接，这样服务器能够实时地对客户端数据进行更新。对一个</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据的访问可以通过</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务调用来完成。</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0pt" align=center></SPAN><o:p><IMG alt="" hspace=0 src="http://blog.csdn.net/images/blog_csdn_net/caviler/78880/o_RIA.gif" align=baseline border=0></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt"><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图</SPAN><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN> <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">典型的</SPAN><SPAN lang=EN-US>RIA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">体系结构</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt 0pt 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">3.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于富客户端的技术</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>Java</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一些相当复杂的客户端应用程序（</SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）都是用</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编写的，这说明可以用</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来建立几乎任何一个能够想象得到的富客户端应用程序。到目前为止，</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已经出现几年了，并且完全支持创建基于窗体的用户界面。除了</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基础类（</SPAN><SPAN lang=EN-US>JFC/Swing</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）中的用户界面组件之外，开发人员还可以使用来自于</SPAN><SPAN lang=EN-US>Eclipse Project</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>SWT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具箱和许多第三方工具箱进行开发。对于图形来说，可以采用</SPAN><SPAN lang=EN-US>Java 2D API--</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个非常完整且非常复杂的图形</SPAN><SPAN lang=EN-US>API</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还具有对</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务无人匹敌的支持能力。你可以通过一个</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">浏览器使用</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">插件软件，或使用</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时环境中较新的</SPAN><SPAN lang=EN-US>Java Web Start</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术来部署应用程序。使用</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">建立富客户端程序的主要缺陷是它的复杂性（即使对简单的窗体和图形也要求编写非常烦琐的代码）。它的优点在于</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准的全面支持，及该语言和类库的深刻内涵。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>XUL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>XUL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（念作</SPAN><SPAN lang=EN-US>"zool"</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）是一个基于</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的用户界面语言，它来自于</SPAN><SPAN lang=EN-US>Mozilla</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的开放源码项目。它可用于建立窗体应用程序，这些应用程序不但可以在</SPAN><SPAN lang=EN-US>Mozilla</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">浏览器上运行，而且也可以运行在其他描述引擎上，如</SPAN><SPAN lang=EN-US>Zulu</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（一个</SPAN><SPAN lang=EN-US>Flash MX</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件）和</SPAN><SPAN lang=EN-US>Thinleys</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（一个</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现）。</SPAN><SPAN lang=EN-US>XUL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">描述引擎都非常小（</SPAN><SPAN lang=EN-US>100K</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以下），它可以使用</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据也可以生成</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据。同</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的情况一样，</SPAN><SPAN lang=EN-US>XUL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也有一个非常大的用户团体，这个团体有大量的开放源工具，如</SPAN><SPAN lang=EN-US>Theodore ThinletEditor</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——一个使你能够以图形化方式布局用户界面，且可以生成相应</SPAN><SPAN lang=EN-US>XUL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用程序。</SPAN><SPAN lang=EN-US>XUL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个主要缺点在于它目前还没有获得一个主要商业实体的支持。</SPAN><SPAN lang=EN-US>XUL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最大的优点在于它与</SPAN><SPAN lang=EN-US>Gecko</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引擎的集成（打开了通向大量</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准的大门），以及与大多数其他</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户界面描述语言相比它是一种非常具有表达力和简洁的语言。</SPAN> </P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>Macromedia Flash</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>Flex</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>Flash</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个已经成熟的商业产品，它可以在</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">网页中引入交互式的图形界面。最近经过升级后，新版本包含了建立窗体风格的应用程序的功能。尽管</SPAN><SPAN lang=EN-US>Flash</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为一个在</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上最广泛部署的前端技术还有争议（取决于所选用的</SPAN><SPAN lang=EN-US>Flash Player</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本），但据称已经有</SPAN><SPAN lang=EN-US>98</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">％以上的桌面系统都支持</SPAN><SPAN lang=EN-US>Falsh</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。由于用来创建动画式图形的</SPAN><SPAN lang=EN-US>Flash</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具其功能十分强大和是可视化的（与之相反其它技术要求进行低级的图形编码），所以图形设计人员使用起来十分得心应手。</SPAN><SPAN lang=EN-US>Flah</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用的脚本语言是</SPAN><SPAN lang=EN-US>ActionScript--ECMAScript 1.5</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个变种，该脚本语言又被称为</SPAN><SPAN lang=EN-US>JavaScript</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产品对</SPAN><SPAN lang=EN-US>Flash</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">增加了一个</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">描述语言，使得可以编译用户界面，并且能够用</SPAN><SPAN lang=EN-US>Flash Player</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来随时进行描述。</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使得传统的开发机构能更好地了解和使用</SPAN><SPAN lang=EN-US>Flash</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>Flash</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的最大缺点在于对</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务等标准的支持很有限，而且作为应用开发工具的环境还不大成熟。</SPAN><SPAN lang=EN-US>Flex</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>Flash</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的优点在于它可以很容易的用来创建复杂的动画式显示，以及可以使用第三方附件。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>Oracle Forms</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>Oracle Forms</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是用来构建以数据库为中心的互联网应用系统的一个成熟的商品化产品。通过</SPAN><SPAN lang=EN-US>Oracle Forms</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，你可以使用一个输出窗体模块文件的可视化设计器创建窗体。为了便于在该设计工具外部进一步进行处理，模块文件要么采用私有的</SPAN><SPAN lang=EN-US>FMT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式，要么采用</SPAN><SPAN lang=EN-US>XML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式。这些模块文件驱动一个描述窗体的</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时环境。除了所有窗体的标准窗口小部件之外，还可以通过集成附加的可插入的</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件和一些定制的</SPAN><SPAN lang=EN-US>JavaBean</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来实现更多的功能性。</SPAN><SPAN lang=EN-US>Oracle Forms</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用的脚本语言为</SPAN><SPAN lang=EN-US>PL/SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库也采用同样的脚本语言。</SPAN><SPAN lang=EN-US>Oracle Forms</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个非常有趣的特点就是，用来建立、编辑和编译窗体模块文件的</SPAN><SPAN lang=EN-US>Java API--</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发人员可以通过创建脚本来生成众多的窗体应用程序，或者进行全局性的改动。</SPAN><SPAN lang=EN-US>Oracle Forms</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的主要缺点是，进行</SPAN><SPAN lang=EN-US>Web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部署需要获得</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用服务器的使用许可。它的优点是，它可以与</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库和</SPAN><SPAN lang=EN-US>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台的其他部分（如</SPAN><SPAN lang=EN-US>Single Sign-On</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（单一登录）和</SPAN><SPAN lang=EN-US>Enterprise Manager</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（企业管理器））紧密集成，对国际化的广泛支持，以及创建以数据为中心应用程序的极高效率。</SPAN> <SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P></SPAN><BR>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"><STRONG>作者Blog：</STRONG><A id=ArticleContent1_ArticleContent1_AuthorBlogLink href="http://blog.csdn.net/Caviler/" target=_blank>http://blog.csdn.net/Caviler/</A></DIV></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/zuroc/aggbug/1870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-09 12:31 <a href="http://www.blogjava.net/zuroc/archive/2005/03/09/1870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发你的Rich Client：IBM对Laszlo开源富客户端平台提供支持</title><link>http://www.blogjava.net/zuroc/archive/2005/03/09/1869.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Wed, 09 Mar 2005 04:22:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/09/1869.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1869.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/09/1869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1869.html</trackback:ping><description><![CDATA[<P><FONT color=#999999>&nbsp;来自：CSDN&nbsp;&nbsp; 熊节 </FONT><BR><BR>IBM AlphaWorks网站近日发布了用于开发Laszlo应用程序的集成开发环境（实际上是一个Eclipse插件），使J2EE开发者能够在他们熟悉的Eclipse环境中快速开发基于Laszlo的rich client应用程序。可以在下列地址下载该插件：</P>
<P><A href="http://alphaworks.ibm.com/tech/ide4laszlo">http://alphaworks.ibm.com/tech/ide4laszlo</A></P>
<P>此外，AlphaWorks网站还提供了一个用Laszlo开发的示例应用，展示了在Eclispe环境下开发Laszlo应用的过程。demo的地址如下：</P>
<P><A href="http://dl.alphaworks.ibm.com/technologies/rcb/demo.html">http://dl.alphaworks.ibm.com/technologies/rcb/demo.html</A></P>
<P>Laszlo是一个开源的rich client开发环境。使用Laszlo平台时，开发者只需编写名为LZX的描述语言（其中整合了XML和JavaScript），运行在J2EE应用服务器上的Laszlo平台会将其编译成FLASH文件并传输给客户端展示。单从运行原理来说，Laszlo与XUL、XAML很类似。但它的最大优势在于：它把描述语言编译成FLASH，而FLASH是任何浏览器都支持的展示形式，从而一举解决了浏览器之间的移植问题。而且，在未来的计划中，Laszlo还可以将LZX编译成Java或.NET本地代码，从而大大提高运行效率。近日Laszlo的CTO David Temkin接受了一个采访，对Laszlo的战略和发展做了更多的介绍：</P><img src ="http://www.blogjava.net/zuroc/aggbug/1869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-09 12:22 <a href="http://www.blogjava.net/zuroc/archive/2005/03/09/1869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序界面：Laszlo平台简介</title><link>http://www.blogjava.net/zuroc/archive/2005/03/09/1868.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Wed, 09 Mar 2005 04:18:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/09/1868.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1868.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/09/1868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1868.html</trackback:ping><description><![CDATA[<DIV class=postTitle><A id=viewpost.ascx_TitleUrl href="http://blog.csdn.net/gigix/archive/2005/01/28/272258.aspx">Laszlo平台简介</A> <FONT color=#ff3366>（来自《程序员》杂志2005年第2期）</FONT><BR><BR>2004年10月，Laszlo Systems公司开放了主要产品Laszlo Platform的源代码，于是有意转向富客户端（rich client）的J2EE开发者们又多了一种选择。在Laszlo之外，rich client的实现策略大抵可以分为两类：以Flex为代表的一派采用独立于浏览器的展现格式（例如Flash），显示效果更美观，也不受浏览器局限，但表现层的开发需要专门技能，J2EE开发者常常不能胜任；以XUL/XAML为代表的一派则依赖于浏览器，开发者只需要编写类似于HTML的标记语言，但浏览器的兼容性则很差。Laszlo则兼具了两者的优势。<BR><BR>&nbsp;<IMG alt="" hspace=0 src="http://www.laszlosystems.com/lps-2.2/docs/guide/images/architecture-2.gif" align=baseline border=0><BR><BR>上面是Laszlo的应用架构图，看起来平淡无奇，任何一个基于Flash的rich client应用都有类似的架构。Laszlo的不同之处在于：在客户端运行的Flash界面不是由美工在Flash编辑器中制作出来的，而是在Laszlo表现服务器（Laszlo Presentation Server，LPS）中根据LZX文件编译生成、再发送到客户端的。LZX是一种界面描述格式，其中包含两部分内容：用于描述界面的XML标记，以及用于事件处理的JavaScript脚本。读者可能会说了：这样的格式不是就和传统的HTML页面很相似了么？正是如此。所以J2EE开发者自己也可以完成整个rich client界面的开发，不必去向美工学习Flash编辑器的用法了。<BR><BR>下面是一段典型的LZX代码。我们在&lt;dataset&gt;中描述一组来自服务器端的数据，随后的&lt;text&gt;标签就可以通过XPath定位到这些数据，并将它们以Flash的形式展现出来：<BR><BR><FONT face="Courier New">&lt;canvas&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;dataset name="dset"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;employee&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;firstName&gt;John&lt;/firstName&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;lastName&gt;Smith&lt;/lastName&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;phone&gt;617-536-7855&lt;/phone&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/employee&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/dataset&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;text datapath="dset:/employee/firstName/text()"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;text datapath="dset:/employee/lastName/text()"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;text datapath="dset:/employee/phone/text()"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;simplelayout axis="x"/&gt;<BR>&lt;/canvas&gt;<BR><BR></FONT>为了迎合J2EE开发者的口味，Laszlo可谓用心良苦：不仅采用标准的XML作为界面描述和数据绑定格式，连事件处理机制都舍弃了Flash现成的ActionScript，转而采用程序员更熟悉的JavaScript。不过用XML描述界面的弊端也很明显，就是开发效率较低。针对这个问题，IBM也开源了一个基于Eclipse的编辑器插件，专门用于可视化开发Laszlo应用程序。读者可以在下列地址找到这个插件：<A href="http://alphaworks.ibm.com/tech/ide4laszlo">http://alphaworks.ibm.com/tech/ide4laszlo</A>。<BR><BR>可是，尽管具备了Flash美观、高度可移植的特点和XUL/XAML的简洁、易开发，但Laszlo仍然存在着诸多问题。首先，脚本的调试会是一件颇为麻烦的事情。虽然Laszlo提供了一个漂亮的脚本调试器，但由于LZX必须通过LPS的编译之后才能显示，因此整个调试过程必须连接在服务器上进行。当界面逻辑变得复杂时，可以预见脚本的调试过程将严重影响开发效率。其次，Laszlo的运行效率和稳定性都存在问题，尤其是在访问一个新界面时，编译Flash的过程长得足以吓跑用户，而且通过网络传输的数据量也偏大。最后，Laszlo对服务器硬件的要求相当高，在大负载环境下是否能保持稳定运行颇可怀疑。<BR><BR>综上所述，Laszlo确实为rich client应用开发提供了一种便利而具有高度可移植性的方案，但这种方案目前看来只适于开发企业内部应用。如果用来开发面向公网的应用，效率和传输数据量的问题可能变得非常严重。因此，将Laszlo称为“Rich Internet Application平台”恐怕还为时过早。<BR></DIV><img src ="http://www.blogjava.net/zuroc/aggbug/1868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-09 12:18 <a href="http://www.blogjava.net/zuroc/archive/2005/03/09/1868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT……内幕？ </title><link>http://www.blogjava.net/zuroc/archive/2005/03/09/1867.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Wed, 09 Mar 2005 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/09/1867.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1867.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/09/1867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1867.html</trackback:ping><description><![CDATA[<SPAN class=javascript id=text134510>SWT……内幕？ <BR>FooSleeper 翻译 <BR><BR>原文：<BR><A class=ilink href="http://groups.yahoo.com/group/straight_talking_java/" target=_blank>http://groups.yahoo.com/group/straight_talking_java/</A><BR><A class=ilink href="http://groups.yahoo.com/group/straight_talking_java/messages/24236" target=_blank>http://groups.yahoo.com/group/straight_talking_java/messages/24236</A><BR><BR>翻译整理：FooSleeper<BR>最后修改：2004-03-03<BR><BR>译注：本文来自straight_talking_java@yahoogroups.com讨论组，已经是一年多前的文章。Alan Williamson是Java Developers Journal的编辑，下文来自他在IBM的一个消息来源。SWT和Swing的论争我见过不少，Netbeans和Eclipse的也同样多。译者翻译此文并不是要激起什么争执，也不是支持哪一方（虽然我的确是站在SWT一边的），更不是要攻击Amy。我最重要的理由是，这是一篇有趣的文章。里面有内幕、线人、公司政治、垄断巨头、美女、商界风云……足够拍一出电影。有趣，这就够了。不过此文反映了IBM对Swing的看法和SWT的由来，还是有一点营养的。<BR><BR>From: Alan Williamson &lt;alan@n-ary.com&gt;<BR>Date: Wed Nov 6, 2002 10:31 am <BR>Reply-To: &lt;straight_talking_java@yahoogroups.com&gt;<BR>To: &lt;straight_talking_java@yahoogroups.com&gt;<BR>Subject: SWT ... the scoop?（SWT……内幕？）<BR><BR>好了这就来……阅读……消化……再阅读……再消化……<BR><IMG alt=Wink src="http://www.cjsdn.net/images/smiles/wink_smile.gif" width=19> <BR><BR>--------------------------------<BR>谢谢你的回复。我很乐意给你提供Swing和SWT背后的一些信息，既然你还把我当作你秘密的“IBM内幕线人”。<BR><BR>要想弄清楚为什么一切都被弄得如此混乱，要从几年前只存在AWT的时候说起。SUN当时已经建立了一套基本的可移植控件类，这些类映射到不同操作系统上的原生窗口组件（native widget），显然下一步应该继续增强这套模型，除了初始的CUA 92组件（文字、按钮等等），再继续加上表格、树、记事本、滑块等等……当时的AWT还满是漏洞，远不能称为可靠，还需要SUN的coder们去修补。SUN的developer们如Graham和Otto总是习惯于公开把他们的bug归咎为操作系统的差异，比如“Windows和OS/2的焦点次序不同”或者“在……之间Ctrl-X的行为不一样”，以及其他苍白的托辞，好让批评的火力从SUN太早释出代码这个问题的真相上移开。然后Amy Fowler来到了SUN。不是我大男子主义，Amy是个聪明的美女，大多数呆头呆脑只懂技术的开发人员都要被她捏在手里。<BR><BR>Amy来自一家Smalltalk公司，叫做Objectshare，在那里她负责搞UI类库。跟Java相比Smalltalk的历史有些悲惨，曾几何时有3家庞大的Smalltalk公司——IBM、Parc-Place和Digitalk。在90年代初期3家公司的市场份额大致相等，生活是美好的。Parc-Place采用仿窗口部件（emulated widgets）的设计（即Swing的设计），IBM和Digitalk则采用原生窗口部件（native widgets）。后来IBM压倒了另外两家，因此他们打算合并成一家，假设叫做Parc-Place Digitalk。随后当他们试图将他们的产品融合到一个叫做Jigsaw的计划中时爆发了一场大战，计划由于政治原因失败了（开发人员实际上已经能让它运转起来），就因为原生和仿造两派的死战。Amy赢得了精神上的胜利，不过在IBM我们赢得了他们所有的生意，因为这两家公司在一整年里除了吵架什么都没做。当尘埃落定之后PPD（Parc-Place Digitalk当时已改名为Objectshare，跟Windscale改名为Sellafield的原因相同——让人们淡忘之前发生的灾难）的股票价格从60美元掉到了低于1美元1股。他们因为伪报收入被NASDAQ摘牌，从此消失。此时SUN正走上与PPD类似的技术方向，于是PDD的技术人员都把他们的简历投到了SUN。Amy被雇佣了，她承诺通过轻量级方案解决所有窗口组件的问题，因此说服SUN管理层让她当了GUI开发部门的头头。她是拿着“这里原来的人都搞砸了，我是来解决的”的钥匙进来的。随后Amy雇佣了所有她过去在Parc-Place的旧朋友，让他们来开发Swing。<BR><BR>显然Swing应该做的是仅仅成为一个绘制框架，给那些希望创建地图软件或者绘图软件的人们使用，无论如何，应该围绕AWT类库来建造它，按钮之类的东西仍然交给AWT来管。SUN的人比如Philip和Mark已经让AWT能够处理表格、树和记事本（notebook，？），所以Swing的方向应该说很明显了。但那些毁了PDD的人不干，他们非要把一切都弄成轻量级的。由于SUN管理层的无知，再加上Amy无情的政治手段，造成了我们今天所见的混乱局面。Amy还使SUN相信Swing是作为Mozilla项目的一部分与Netscape联合开发的，事实上这只是她的宣传伎俩。<BR><BR>在IBM，我们从第一天起就憎恶Swing。庞大、满是错误，而且难看至极。原先我们的工具如VisualAge for Java都是用Smalltalk（用的是原生窗口组件）写的，所以当我们将这些工具向Java代码库迁移时，我们需要一套窗口组件。IBM这边的开发人员都是原来搞Smalltalk的那一批人，我们对管理层要求用Swing来构建WebSphere Studio工具都非常不情愿。Swing是个可怕的充满缺陷的怪兽。在WebSphere Studio最初的预览中，当与Microsoft Visual Studio作对比演示的时候，我们所有的客户都讨厌它，就因为它的外观，而不管它的功能有多强。大多数消费者都不会买一辆让人觉得难看的车，哪怕这车有一台出色的引擎。因此我们开始了一个项目，是把我们的Smalltalk原生窗口组件移植到Java上去。这个项目是加拿大的Object Technology International小组做的。这个项目获得了成功，被运用在在我们发布的VisualAge Micro Edition产品中，VisualAge Micro Edition后来成为J2ME开发方面一个非常成功的IDE。但是OTI的人发现，Swing在读取Windows事件方面有极严重的缺陷，我们甚至无法进行SWT（S开始是Simple的缩写，不过后来变成了Standard的缩写）和Swing间的互操作。他们在读事件队列的时候用了一种可能留下内存漏洞的方式，所以我们不得不采用我们自己的查询Windows事件队列的循环，以纠正这个错误。我们试了一次又一次让SUN修复这个错误，但Amy就是听不进去，所以我们才决定SWT和AWT/Swing不能共存。我们甚至在SWT中定义了自己的Point和Rectangle类——整个工具包对AWT或Swing都没有任何依赖。我们把这个工具包放到了Eclipse中，这是一个工具平台，它的总体设计目标就是要战胜Micrsoft和Visual Studio。Eclipse是开源的，所以任何人都可以在上面构建自己的东西，我们已经有像TogetherSoft和Rational这样的公司移植到了上面。我们的竞争者是Microsoft，所以我们所有努力和注意力都是从正面针对Microsoft。<BR><BR>不管怎么说SUN对此非常不满。他们的Netbeans跟Eclipse做的是相同的事，因此他们向IBM高层抱怨。他们认为SWT是要将你绑到Windows上，这纯粹是胡说，因为SWT能通过GTK在Mac/Linux上运行，以及一大堆嵌入式平台。他们拒绝让Eclipse获得Java认证，因为里面有原生代码，所以Eclipse产品必须很小心地使用单词“Java”这个SUN的商标。Eclipse甚至不能把自己称为一个Java IDE，SUN已经威胁过要采取法律行动来制止IBM在任何时候把Eclipse称作一个Java IDE。结果之一就是IBM在Eclipse上创建的GUI设计工具，允许你构建Swing/AWT GUI，却不让你往里面拖放SWT窗口控件。<BR><BR>将SWT从Eclipse中分离出来是完全可能的，只需要把DLL抠出来放到路径中，并使用窗口组件工具包来给你的银行或者保险或者其他什么应用程序开发GUI。再次说明，我们无法更进一步，因为SUN把我们的双手绑上了。虽然作为Eclipse开放源码协议的一部分，CPL允许我们提供这样的解决方案，但SUN已经很清楚地表明他们不希望我们这样做。<BR><BR>对于用户社区来说，无论IBM和SUN的最终动机是什么，我发现有一点总是很有趣：喜爱Swing的人总会说“一旦你花上几年时间去掌握它，你就能正确地使用它”，这基本上是他们在试图证明和维护他们辛苦得来的用途有限的专门技术；而SWT的拥护者们说的是“哇，这真快，这跟原生的一样，还可以用XP皮肤……它还又轻又小”。有一句话是我喜欢的，我们的一个用户说，Swing就像Java决定不通过操作系统来实现原生的IO，而是通过磁头马达API自己来读磁盘的扇区。Swing基本上就是这样的，它拿着个底层的“paint(Graphics)”方法，自己来绘制所有的窗口组件。<BR>--------------------------------<BR><BR>后记：现在的情况已经有所不同，SWT到底还是单独发布了，VE也承诺在1.0版的时候支持SWT的GUI设计。 </SPAN><BR><img src ="http://www.blogjava.net/zuroc/aggbug/1867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-09 11:39 <a href="http://www.blogjava.net/zuroc/archive/2005/03/09/1867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AWT 和 SWING 的强大竞争者：SWT 简介 </title><link>http://www.blogjava.net/zuroc/archive/2005/03/08/1823.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Tue, 08 Mar 2005 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/08/1823.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1823.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/08/1823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1823.html</trackback:ping><description><![CDATA[<DIV class=postTitle><A href="http://blog.csdn.net/yjz0065/archive/2005/03/02/308066.aspx" id=viewpost.ascx_TitleUrl>AWT 和 SWING 的强大竞争者：SWT 简介</A> <BR>来自<A href="http://blog.csdn.net/yjz0065/archive/2005/03/02/308066.aspx">http://blog.csdn.net/yjz0065/archive/2005/03/02/308066.aspx</A><BR>Java语言的声望和它在桌面应用程序（GUI程序）所取得的成就显然极不相符，至今仍然很少能看到非常成功Java桌面程序。虽然有JBuilder，Netbean，JProbe等大型软件作为代表，但这仍不能证明Java的GUI程序是成功的：它们的外观总是和同一操作系统平台下的其它软件显得格格不入。对机器配置的需求也似乎永无止境，这使得它们只能被一些总是拥有当前最高性能PC的程序员们所容忍，或是那些不在乎金钱和时间的专业用户所接受。对绝大多数计算机使用者来说，AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget Toolkit（SWT）或许是Java这一噩梦的终结者，广大Java程序员终于可以开发出高效率的GUI程序，它们拥有标准的外观，几乎没有人能看出你的程序是用Java写出来的，更为重要的是，这些程序是跨平台的。</DIV>
<DIV class=postText>
<P>SWT本身仅仅是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API。或许是无心插柳，或是有意为之，至今为止，SWT无论是在性能和外观上，都超越了SUN公司提供的AWT和SWING。目前Eclipse IDE已经开发到了2.1版本，SWT已经十分稳定。这里指的稳定应该包含两层意思：</P>
<P>一是指性能上的稳定，其中的关键是源于SWT的设计理念。SWT最大化了操作系统的图形构件API，就是说只要操作系统提供了相应图形的构件，那么SWT只是简单应用JNI技术调用它们，只有那些操作系统中不提供的构件，SWT才自己去做一个模拟的实现。可以看出SWT的性能上的稳定大多时候取决于相应操作系统图形构件的稳定性。</P>
<P>另一个稳定是指SWT API包中的类、方法的名称和结构已经少有改变，程序员不用担心由于Eclipse组织开发进度很快（Eclipse IDE每天都会有一个Nightly版本的发布），而导致自己的程序代码变化过大。从一个版本的SWT更新至另一版本，通常只需要简单将SWT包换掉就可以了。</P>
<P>第一个SWT程序</P>
<P>下面让我们开始一个SWT程序。（注意：以下的例子和说明主要针对Windows平台，其它的操作系统应该大同小异）。首先要在Eclipse安装文件中找到SWT包，Eclipse组织并不提供单独的SWT包下载，必须下载完整的Eclipse开发环境才能得到SWT包。SWT是作为Eclipse开发环境的一个插件形式存在，可以在$｛你的eclipse安装路径｝\plugins路径下的众多子目录下去搜索SWT.JAR文件，在找到的JAR文件中包含了SWT全部的Java类文件。因为SWT应用了JNI技术，因此同时也要找到相对应的JNI本地化库文件，由于版本和操作平台的不同，本地化库文件的名称会有些差别，比如SWT-WIN32-2116.DLL是Window平台下Eclipse Build 2116的动态库，而在Unix平台相应版本的库文件的扩展名应该是.so，等等。注意的是，Eclipse是一个开放源代码的项目，因此你也可以在这些目录中找到SWT的源代码，相信这会对开发很有帮助。下面是一段打开空窗口的代码(只有main方法)。 <BR>import com.e2one.example;<BR>public class OpenShell{<BR>public static void main(String [] args) {<BR>&nbsp;&nbsp;&nbsp; Display display = new Display();<BR>&nbsp;&nbsp;&nbsp; Shell shell = new Shell(display);<BR>&nbsp;&nbsp;&nbsp; shell.open();<BR>&nbsp;&nbsp;&nbsp; // 开始事件处理循环，直到用户关闭窗口<BR>while (!shell.isDisposed()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!display.readAndDispatch())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display.sleep();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; display.dispose();<BR>}<BR>}<BR>&nbsp;</P>
<P></P>
<P>确信在CLASSPATH中包括了SWT.JAR文件，先用Javac编译例子程序。编译无错后可运行java -Djava.library.path=${你的SWT本地库文件所在路径} com.e2one.example.OpenShell，比如SWT-WIN32-2116.DLL件所在的路径是C:\swtlib，运行的命令应该是java -Djava.library.path=c:\swtlib com.e2one.example.OpenShell。成功运行后，系统会打开了一个空的窗口。 </P>
<P>剖析SWT API </P>
<P>下面再让我们进一步分析SWT API的组成。所有的SWT类都用org.eclipse.swt做为包的前缀，下面为了简化说明，我们用*号代表前缀org.eclipse.swt，比如*.widgets包，代表的是org.eclipse.swt.widgets包。 </P>
<P>我们最常用的图形构件基本都被包括在*.widgets包中，比如Button，Combo，Text，Label，Sash，Table等等。其中两个最重要的构件当数Shell和Composite。Shell相当于应用程序的主窗口框架，上面的例子代码中就是应用Shell构件打开一个空窗口。Composite相当于SWING中的Panel对象，充当着构件容器的角色，当我们想在一个窗口中加入一些构件时，最好到使用Composite作为其它构件的容器，然后再去*.layout包找出一种合适的布局方式。SWT对构件的布局也采用了SWING或AWT中Layout和Layout Data结合的方式，在*.layout包中可以找到四种Layout和与它们相对应的布局结构对象（Layout Data）。在*.custom包中，包含了对一些基本图形构件的扩展，比如其中的CLabel，就是对标准Label构件的扩展，上面可以同时加入文字和图片，也可以加边框。StyledText是Text构件的扩展，它提供了丰富的文本功能，比如对某段文字的背景色、前景色或字体的设置。在*.custom包中也可找到一个新的StackLayout布局方式。 </P>
<P>SWT对用户操作的响应，比如鼠标或键盘事件，也是采用了AWT和SWING中的Observer模式，在*.event包中可以找到事件监听的Listener接口和相应的事件对象，例如常用的鼠标事件监听接口MouseListener，MouseMoveListener和MouseTrackListener，及对应的事件对象MouseEvent。 </P>
<P>*.graphics包中可以找到针对图片、光标、字体或绘图的API。比如可通过Image类调用系统中不同类型的图片文件。通过GC类实现对图片、构件或显示器的绘图功能。 </P>
<P>对不同平台，Eclipse还开发了一些富有针对性的API。例如，在Windows平台，可以通过*.ole.win32包很容易的调用ole控件，这使Java程序内嵌IE浏览器或Word、Excel等程序成为可能！ </P>
<P>更复杂的程序 </P>
<P>下面让我们展示一个比上面例子更加复杂一些的程序。这个程序拥有一个文本框和一个按键，当用户点击按键的时候，文本框显示一句欢迎信息。 </P>
<P>为了文本框和按键有比较合理的大小和布局，这里采用了GradLayout布局方式。这种布局是SWT中最常用也是最强大的布局方式，几乎所有的格式都可能通过GradLayout去达到。下面的程序也涉及到了如何应用系统资源(Color)，以及如何释放系统资源。 </P>
<P><BR>private void initShell(Shell shell) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为Shell设置布局对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridLayout gShellLay = new GridLayout();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell.setLayout(gShellLay);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //构造一个Composite构件作为文本框和按键的容器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Composite panel = new Composite(shell,SWT.NONE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为Panel指定一个布局结构对象。<BR>&nbsp;&nbsp;这里让Panel尽可能的占满Shell，<BR>&nbsp;&nbsp;也就是全部应用程序窗口的空间。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridData gPanelData = new GridData<BR>&nbsp;&nbsp;(GridData.GRAB_HORIZONTAL|<BR>&nbsp;&nbsp;GridData.GRAB_VERTICAL|GridData.FILL_BOTH);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; panel.setLayoutData(gPanelData);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为Panel也设置一个布局对象。<BR>&nbsp;&nbsp;文本框和按键将按这个布局对象来显示。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridLayout gPanelLay = new GridLayout();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; panel.setLayout(gPanelLay);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为Panel生成一个背景色<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Color bkColor = new <BR>&nbsp;&nbsp;Color(Display.getCurrent(),200,0,200);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; panel.setBackground(bkColor);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //生成文本框<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Text text = new <BR>&nbsp;&nbsp;Text(panel,SWT.MULTI|SWT.WRAP);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为文本框指定一个布局结构对象，<BR>&nbsp;&nbsp;这里让文本框尽可能的占满Panel的空间。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridData gTextData = new GridData<BR>&nbsp;&nbsp;(GridData.GRAB_HORIZONTAL|<BR>&nbsp;&nbsp;GridData.GRAB_VERTICAL|GridData.FILL_BOTH);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text.setLayoutData(gTextData);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //生成按键<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button butt = new Button(panel,SWT.PUSH);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; butt.setText("Push");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为按键指定鼠标事件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; butt.addMouseListener(new MouseAdapter(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void mouseDown(MouseEvent e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //当用户点击按键的时候，显示信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text.setText("Hello SWT");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //当主窗口关闭时，会触发DisposeListener。<BR>&nbsp;&nbsp;这里用来释放Panel的背景色。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shell.addDisposeListener(new DisposeListener(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void widgetDisposed(DisposeEvent e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bkColor.dispose();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;</P>
<P></P>
<P>把这段代码中的方法initShell()加入到第一个打开空窗口的例子中，得到的是一段能成功运行的完整GUI应用程序。运行方法可参考第一个例子。 </P>
<P>系统资源的管理 </P>
<P>在一个图形化的操作系统中开发程序，都要调用系统中的资源，如图片、字体、颜色等。通常这些资源都是有限的，程序员务必非常小心的使用这些资源：当不再使用它们时，就请尽快释放，不然操作系统迟早会油尽灯枯，不得不重新启动，更严重的会导致系统崩溃。 </P>
<P>&nbsp;SWT是用Java开发的，Java语言本身的一大优势就是JVM的"垃圾回收机制"，程序员通常不用理会变量的释放，内存的回收等问题。那么对SWT而言，系统资源的操作是不是也是如此？答案是一个坏消息，一个好消息。</P>
<P>坏消息是SWT并没采用JVM的垃圾回收机制去处理操作系统的资源回收问题，一个关键的因素是因为JVM的垃圾回收机制是不可控的，也就是说程序员不能知道，也不可能做到在某一时刻让JVM回收资源！这对系统资源的处理是致命的，试想你的程序希望在一个循环语句中去查看数万张图片，常规的处理方式是每次调入一张，查看，然后就立即释放该图片资源，而后在循环调入下一张图片，这对操作系统而言，任何时刻程序占用的仅仅是一张图片的资源。但如果这个过程完全交给JVM去处理，也许会是在循环语句结束后，JVM才会去释放图片资源，其结果可能是你的程序还没有运行结束，操作系统已经宕掉。</P>
<P>但下面的好消息也许会让这个坏消息变得无关紧要。对于SWT，只需了解两条简单的"黄金"法则就可以放心的使用系统资源！之所以称为黄金法则，一是因为少，只有两条，二是因为它们出奇的简单。第一条是"谁占用，谁释放"，第二条是"父构件被销毁，子构件也同时被销毁"。第一条原则是一个无任何例外的原则，只要程序调用了系统资源类的构造函数，程序就应该关心在某一时刻要释放这个系统资源。比如调用了</P>
<P><BR>Font font = new Font (display, "Courier", 10, SWT.NORMAL);<BR>&nbsp;</P>
<P></P>
<P>那么就应该在不在需要这个Font的时候调用 </P>
<P><BR>font.dispose();<BR>&nbsp;</P>
<P></P>
<P>对于第二个原则，是指如果程序调用某一构件的dispose()方法，那么所有这个构件的子构件也会被自动调用dispose()方法而销毁。通常这里指的子构件与父构件的关系是在调用构件的构造函数时形成的。比如， </P>
<P><BR>Shell shell = new Shell();<BR>&nbsp;&nbsp;&nbsp; Composite parent = new Composite(shell,SWT.NULL);<BR>&nbsp;&nbsp;&nbsp; Composite child = new Composite(parent,SWT.NULL);<BR>&nbsp;</P>
<P></P>
<P>其中parent的父构件是shell，而shell则是程序的主窗口，所以没有相应的父构件，同时parent又包括了child子构件。如果调用shell.dispose()方法，应用第二条法则，那么parent和child构件的dispose()方法也会被SWT API自动调用，它们也随之销毁。 </P>
<P>线程问题 </P>
<P>在任何操作平台的GUI系统中，对构件或一些图形API的访问操作都要被严格同步并串行化。例如，在一个图形界面中的按键构件可被设成可用状态(enable)或禁用状态(disable)，正常的处理方式是，用户对按键状态设置操作都要被放入到GUI系统的事件处理队列中（这意味着访问操作被串行化），然后依次处理（这意味着访问操作被同步）。想象当按键可用状态的设置函数还没有执行结束的时候，程序就希望再设置该按键为禁用状态，势必会引起冲突。实际上，这种操作在任何GUI系统都会触发异常。 </P>
<P>Java语言本身就提供了多线程机制，这种机制对GUI编程来说是不利的，它不能保证图形构件操作的同步与串行化。SWT采用了一种简单而直接的方式去适应本地GUI系统对线程的要求：在SWT中，通常存在一个被称为"用户线程"的唯一线程，只有在这个线程中才能调用对构件或某些图形API的访问操作。如果在非用户线程中程序直接调用这些访问操作，那么SWTExcepiton异常会被抛出。但是SWT也在*.widget.Display类中提供了两个方法可以间接的在非用户线程的进行图形构件的访问操作，这是通过的syncExec(Runnable)和asyncExec(Runnable)这两个方法去实现的。例如： </P>
<P><BR>//此时程序运行在一个非用户线程中，并且希望在构件panel上加入一个按键。</P>
<P>Display.getCurrent().asyncExec(new Runnable() {<BR>&nbsp;&nbsp;&nbsp; public void run() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button butt = new Button(panel,SWT.PUSH);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; butt.setText("Push");<BR>&nbsp;&nbsp;&nbsp; }<BR>});<BR>&nbsp;</P>
<P></P>
<P>方法syncExec()和asyncExec()的区别在于前者要在指定的线程执行结束后才返回，而后者则无论指定的线程是否执行都会立即返回到当前线程。 </P>
<P>SWT的扩展：JFace </P>
<P>JFace与SWT的关系好比Microsoft的MFC与SDK的关系，JFace是基于SWT开发，其API比SWT更加易于使用，但功能却没SWT来的直接。比如下面的代码应用JFace中的MessageDialog打开一个警告对话框： </P>
<P><BR>MessageDialog.openWarning(parent,"Warning","Warning message");<BR>&nbsp;</P>
<P></P>
<P>如果只用SWT完成以上功能，语句不会少于30行! </P>
<P>JFace原本是为更加方便的使用SWT而编写的一组API，其主要目的是为了开发Eclipse IDE环境，而不是为了应用到其它的独立应用程序。因此在Eclipse 2.1版本之前，很难将JFace API完整的从Eclipse的内核API中剥离出来，总是要多多少少导入一些非JFace以外的Eclipse核心代码类或接口才能得到一个没有任何编译错误的JFace开发包。但目前Eclipse组织似乎已经逐渐意识到了JFace在开发独立应用程序起到的重要作用，在正在开发的2.1版本中，JFace也开始变成了和SWT一样的完整独立的开发包，只是这个开发包还在变动中(笔者写本文时，应用的Eclipse2.1M3版本)。JFace开发包的包前缀是以org.eclipse.jface开头。JAR包和源代码也和SWT一样，也在$｛你的eclipse安装路径｝\plugins路径下去找。 </P>
<P>对开发人员来说，在开发一个图形构件的时候，比较好的方式是先到JFace包去找一找，看是不是有更简洁的实现方法，如果没有再用SWT包去自己实现。比如JFace为对话框提供了很好的支持，除了各种类型的对话框(比如上面用的MessageDialog，或是带有Title栏的对话框)，如要实现一个自定义的对话框也最好从JFace中的Dialog类继承，而不是从SWT中的*.widget.Dialog继承。 </P>
<P>应用JFace中的Preference包中的类很容易为自己的软件做出一个很专业的配置对话框。对于Tree、Table等图形构件，它们在显示的同时也要和数据关联，例如Table中显示的数据，在JFace中的View包中为此类构件提供了Model-View方式的编程方法，这种方法使显示与数据分开，更加利于开发与维护。JFace中提供最多的功能就是对文本内容的处理。可以在org.eclipse.jface.text.*包中找到数十个与文本处理相关类。 </P>
<P>与应用程序更近一步 </P>
<P>Java程序通常是以class文件的方式发布的，运行class需要JRE或JDK的支持。这又是Java GUI程序的另一个致命的弱点，想象对一个面向广大用户的应用程序来说，无论你的程序功能有多简单，或是你的代码十分的精简，你都不得不让用户去下载一个7、8M的JRE，那是多么令人沮丧的一件事。而且对程序员来说，Class通常意味着源代码的暴露，反编译的工具让那些居心叵测的人轻易得到你的源代码。虽然有很多对Class的加密方法，但那总是以牺牲性能为代价的。好在我们还有其它的方式可用：把Class编译成exe文件! </P>
<P>通过SWT开发包，简单、跨平台、可靠等这些Java语言本身所具有的优点正渐渐融合到图形界面的应用程序开发中去。因此，我相信Java语言的另一扇成功之门正在逐渐打开。 </P></DIV><img src ="http://www.blogjava.net/zuroc/aggbug/1823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-08 13:14 <a href="http://www.blogjava.net/zuroc/archive/2005/03/08/1823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 细讲一下“回调”</title><link>http://www.blogjava.net/zuroc/archive/2005/03/07/1806.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Mon, 07 Mar 2005 10:37:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/07/1806.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1806.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/07/1806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1806.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent><FONT color=#a52a2a>熟悉 MS-Windows 和 X Window System 事件驱动编程模型的开发人员，习惯于传递在某种事件发生时调用（即“回调”）的函数指针。Java 的面向对象模型目前并不支持方法指针，这样似乎就不可能使用这种很好的机制。但我们并不是一点办法都没有！ <BR>Java 的接口支持提供了一种获得回调的等价功能的机制。其技巧就是：定义一个简单接口，并在该接口中声明我们要调用的方法。 <BR><BR>例如，假定我们希望在某个事件发生时得到通知。我们可以定义一个接口： <BR><BR>public interface InterestingEvent<BR>{<BR>// 这仅是一个常规方法。因此如果需要，<BR>// 它可有返回值，也可接收参数。<BR>public void interestingEvent ();<BR>}<BR><BR><BR>这使得我们可以控制实现该接口的类的任何对象。因此，我们不必关心任何外部类型信息。与在将 C++ 代码用于 Motif 时使用窗口小部件的数据域来容纳对象指针的难以控制的 C 函数相比，这种方法要好得多。 <BR><BR>发出事件信号的类必须等待实现了 InterestingEvent 接口的对象，并在适当时候调用 interestingEvent() 方法。 <BR><BR>public class EventNotifier<BR>{<BR>private InterestingEvent ie;<BR>private boolean somethingHappened;<BR><BR>public EventNotifier (InterestingEvent event)<BR>{<BR>// 保存事件对象以备后用。<BR>ie = event;<BR><BR>// 还没有要报告的事件。<BR>somethingHappened = false;<BR>}<BR><BR>//... <BR><BR>public void doWork ()<BR>{<BR>// 检查在别处设置的谓词。<BR>if (somethingHappened)<BR>{<BR>// 通过调用接口的这个方法发出事件信号。<BR>ie.interestingEvent ();<BR>}<BR>//...<BR>}<BR><BR>// ...<BR>}<BR><BR><BR>在上例中，我使用 somethingHappened 谓词来跟踪是否应触发事件。在许多情况下，调用此方法足以保证向 interestingEvent() 发出信号。 <BR><BR>希望接收事件通知的代码必须实现 InterestingEvent 接口，并将自身引用传递给事件通知程序。 <BR><BR>public class CallMe implements InterestingEvent<BR>{<BR>private EventNotifier en;<BR><BR>public CallMe ()<BR>{<BR>// 创建事件通知程序，并将自身引用传递给它。<BR>en = new EventNotifier (this);<BR>}<BR><BR>// 为事件定义实际的处理程序。<BR>public void interestingEvent ()<BR>{<BR>// 噢！必定发生了感兴趣的事件！<BR>// 执行某些操作 ...<BR>}<BR><BR>//...<BR>}<BR></FONT></SPAN><BR>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"><STRONG>作者Blog：</STRONG><A href="http://blog.csdn.net/chensheng913/" id=ArticleContent1_ArticleContent1_AuthorBlogLink target=_blank>http://blog.csdn.net/chensheng913/</A></DIV><img src ="http://www.blogjava.net/zuroc/aggbug/1806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-07 18:37 <a href="http://www.blogjava.net/zuroc/archive/2005/03/07/1806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习RCP</title><link>http://www.blogjava.net/zuroc/archive/2005/03/05/1729.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Sat, 05 Mar 2005 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/05/1729.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1729.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/05/1729.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1729.html</trackback:ping><description><![CDATA[<DIV class=post>来自下面的链接： <BR><A href="http://blog.csdn.net/sean_gao/archive/2005/03/04/310576.aspx#FeedBack" target=_new><FONT color=#770000>http://blog.csdn.net/sean_gao/archive/2005/03/04/310576.aspx#FeedBack</FONT></A> <BR><BR>Eclipse绝不是一个简单的IDE，而是一个平台。为什么是一个平台？事实上，平时使用的Eclipse IDE，是Eclipse Platform + JDT的成果。加入CDT的话，就变成C/C++的IDE了。而IBM自己的RAD，则是继续加入了服务器测试环境，建模工具。那么，除了使用Eclipse IDE，我们可以做些什么呢？我们可以为Eclipse贡献插件（比如SQLExplore这样的插件）。更进一步，使用Eclipse的RCP平台，Eclipse RCP + 我们自己写的插件，就成为典型的出面应用程序（一个和Eclipse IDE一样的高性能桌面应用）。RCP比Microsoft的MFC这样的框架更加先进（虽然开发起来非常相像），原因就在于，RCP与生俱来的扩展性：插件。可以这样想想看，用RCP开发自己的系统，可以使用别人写好的开源的插件，甚至在完成以后，别人还可以在这个系统上继续添加插件来增强功能。（Eclipse的IDE就是这样越来越强大的） 
<DIV class=postfoot>&nbsp;</DIV></DIV>
<DIV class=post>换个角度想想看，如果你给客户开发了一个RCP的桌面应用，客户需要扩展功能的时候，我们甚至可以培训客户在Eclipse PDE下开发插件来扩展系统。有点不合实际，但是RCP的扩展性为这种应用带来了可能。另外，在SourceForge上有一个EclipseTrade的基于RCP的股票实时显示和chart的小系统。可以去下载了看看，完全没有IDE的东西（没有编辑器，调试和Team），但是有Perspective, View, Help和典型的Eclipse的界面。 <BR><BR>教程 <A href="http://blog.csdn.net/chenyun2000/category/36272.aspx?Show=All">http://blog.csdn.net/chenyun2000/category/36272.aspx?Show=All</A></DIV><img src ="http://www.blogjava.net/zuroc/aggbug/1729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-05 18:08 <a href="http://www.blogjava.net/zuroc/archive/2005/03/05/1729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclips使用秘技(绝对经典) </title><link>http://www.blogjava.net/zuroc/archive/2005/03/04/1701.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Fri, 04 Mar 2005 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/04/1701.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1701.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/04/1701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1701.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1701.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD class=title1 align=middle width="100%" bgColor=#eeeeee colSpan=3 height=40><B>Eclips使用秘技(绝对经典)</B></TD></TR>
<TR>
<TD align=middle width="100%" bgColor=#eeeeee><A href="http://www.javaresearch.org/profile.jsp?user=7864">TonnyHot</A> 转贴&nbsp; (参与分：12582，专家分：2060)&nbsp;&nbsp; 发表：2005-3-4 下午10:13 &nbsp;&nbsp;版本：1.0 &nbsp;&nbsp;阅读：<B>24</B>次 </TD></TR></TBODY></TABLE></TD></TR><!-- end of article title -->
<TR>
<TD vAlign=top align=middle width="100%"><!--start of article content -->
<TABLE width="98%" border=0>
<TBODY>
<TR>
<TD class=text align=left width="100%"><BR><!-- Google Ad -->
<TABLE cellSpacing=0 cellPadding=0 align=right border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 align=left border=0>
<TBODY>
<TR>
<TD><!-- 这儿显示Google的广告 -->
<SCRIPT language=javascript>showbanner(6,6);</SCRIPT>

<SCRIPT type=text/javascript>google_ad_client ="pub-2141342037947367";google_ad_width = 120;google_ad_height =240;google_ad_format = "120x240_as";google_ad_channel="3662469727";google_color_border = "CCCCCC";google_color_bg ="FFFFFF";google_color_link = "000000";google_color_url ="666666";google_color_text = "333333";</SCRIPT>

<SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript></SCRIPT>
<IFRAME name=google_ads_frame marginWidth=0 marginHeight=0 src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-2141342037947367&amp;dt=1109949215000&amp;lmt=1109949215&amp;format=120x240_as&amp;output=html&amp;channel=3662469727&amp;url=http%3A%2F%2Fwww.javaresearch.org%2Farticle%2Fshowarticle.jsp%3Fcolumn%3D91%26thread%3D22796&amp;color_bg=FFFFFF&amp;color_text=333333&amp;color_link=000000&amp;color_url=666666&amp;color_border=CCCCCC&amp;ref=http%3A%2F%2Fwww.javaresearch.org%2F&amp;u_h=600&amp;u_w=800&amp;u_ah=572&amp;u_aw=800&amp;u_cd=16&amp;u_tz=480&amp;u_java=true" frameBorder=0 width=120 scrolling=no height=240 allowTransparency><img height="1" width="1" border="0" src="http://pagead2.googlesyndication.com/pagead/imp.gif?event=noiframe&client=ca-pub-2141342037947367&dt=1109949215000&lmt=1109949215&format=120x240_as&output=html&channel=3662469727&url=http%3A%2F%2Fwww.javaresearch.org%2Farticle%2Fshowarticle.jsp%3Fcolumn%3D91%26thread%3D22796&color_bg=FFFFFF&color_text=333333&color_link=000000&color_url=666666&color_border=CCCCCC&ref=http%3A%2F%2Fwww.javaresearch.org%2F&u_h=600&u_w=800&u_ah=572&u_aw=800&u_cd=16&u_tz=480&u_java=true" /></IFRAME></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>Author：sungo&nbsp;<BR><BR>前言：&nbsp;<BR>本来我都是使用JBuilderX当主力IDE、但使用了Eclipse后&nbsp;<BR>发现...Eclipse原来也这么好用...渐渐的就爱上了它......&nbsp;<BR>Eclipse优点：免费、程序代码排版功能、有中文化包、可增&nbsp;<BR>设许多功能强大的外挂、支持多种操作系统(Windows、&nbsp;<BR>Linux、Solaris、Mac&nbsp;OSX)..等等。&nbsp;<BR><BR>开此篇讨论串的目的，是希望能将Eclipse的一些使用技巧集&nbsp;<BR>合起来...欢迎大家继续补充下去...由于Eclipse的版本众多&nbsp;<BR>，希望补充的先进们能顺便说明一下您所使用的版本～&nbsp;<BR><BR>Eclipse网站：<A href="http://www.eclipse.org/&nbsp;">http://www.eclipse.org/&nbsp;</A>;<BR>Eclipse中文化教学：JavaWorld站内文章参考&nbsp;<BR><BR>(使用版本：Eclipse&nbsp;2.1.2&nbsp;Release&nbsp;+&nbsp;中文化)&nbsp;<BR><BR>热键篇：&nbsp;<BR>Template：Alt&nbsp;+&nbsp;/&nbsp;<BR>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;编辑-&gt;内容辅助。&nbsp;<BR>个人习惯：Shift+SPACE(空白)。&nbsp;<BR>简易说明：编辑程序代码时，打sysout&nbsp;+Template启动键，就&nbsp;<BR>会自动出现：System.out.println();&nbsp;。&nbsp;<BR>设定Template的格式：窗口-&gt;喜好设定-&gt;Java-&gt;编辑器-&gt;模板。&nbsp;<BR><BR>程序代码自动排版：Ctrl+Shift+F&nbsp;<BR>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;程序代码-&gt;格式。&nbsp;<BR>个人习惯：Alt+Z。&nbsp;<BR>自动排版设定：窗口-&gt;喜好设定-&gt;Java-&gt;程序代码格式制作程序。&nbsp;<BR>样式页面-&gt;将插入tab(而非空格键)以内缩，该选项取消勾选&nbsp;<BR>，下面空格数目填4，这样在自动编排时会以空格4作缩排。&nbsp;<BR><BR>快速执行程序：Ctrl&nbsp;+&nbsp;F11&nbsp;<BR>个人习惯：ALT+X&nbsp;<BR>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;执行-&gt;启动前一次的启动作业。&nbsp;<BR>简易说明：第一次执行时，它会询问您执行模式，&nbsp;<BR>设置好后，以后只要按这个热键，它就会快速执行。&nbsp;<BR>&lt;ALT+Z(排版完)、ATL+X(执行)&gt;..我觉得很顺手^___^&nbsp;<BR><BR>自动汇入所需要的类别：Ctrl+Shift+O&nbsp;<BR>简易说明：&nbsp;<BR>假设我们没有Import任何类别时，当我们在程序里打入：&nbsp;<BR><BR>BufferedReader&nbsp;buf&nbsp;=&nbsp;<BR>new&nbsp;BufferedReader(new&nbsp;InputStreamReader(System.in));&nbsp;<BR><BR>此时Eclipse会警示说没有汇入类别，这时我们只要按下Ctrl+Shift+O&nbsp;<BR>，它就会自动帮我们Import类别。&nbsp;<BR><BR>查看使用类别的原始码：Ctrl+鼠标左键点击&nbsp;<BR>简易说明：可以看到您所使用类别的原始码。&nbsp;<BR><BR>将选取的文字批注起来：Ctrl+/&nbsp;<BR>简易说明：Debug时很方便。&nbsp;<BR>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;程序代码-&gt;批注&nbsp;<BR><BR>视景切换：Ctrl+F8&nbsp;<BR>个人习惯：Alt+S。&nbsp;<BR>修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;窗口-&gt;下一个视景。&nbsp;<BR>简易说明：可以方便我们快速切换编辑、除错等视景。&nbsp;<BR><BR>密技篇：&nbsp;<BR>一套Eclipse可同时切换，英文、繁体、简体显示：&nbsp;<BR>1.首先要先安装完中文化包。&nbsp;<BR>2.在桌面的快捷方式后面加上参数即可，&nbsp;<BR>英文-&gt;&nbsp;-nl&nbsp;"zh_US"&nbsp;<BR>繁体-&gt;&nbsp;-nl&nbsp;"zh_TW"&nbsp;<BR>简体-&gt;&nbsp;-nl&nbsp;"zh_CN"。&nbsp;<BR>(其它语系以此类推)&nbsp;<BR>像我2.1.2中文化后，我在我桌面的Eclipse快捷方式加入参数-n1&nbsp;"zh_US"。&nbsp;<BR>"C:\Program&nbsp;Files\eclipse\eclipse.exe"&nbsp;-n&nbsp;"zh_US"&nbsp;<BR>接口就会变回英文语系噜。&nbsp;<BR><BR>利用Eclipse，在Word编辑文书时可不必将程序代码重新编排：&nbsp;<BR>将Eclipse程序编辑区的程序代码整个复制下来(Ctrl+C)，直接贴(Ctrl+V)到&nbsp;<BR>Word或WordPad上，您将会发现在Word里的程序代码格式，跟Eclipse&nbsp;<BR>所设定的完全一样，包括字型、缩排、关键词颜色。我曾试过JBuilder&nbsp;<BR>、GEL、NetBeans...使用复制贴上时，只有缩排格式一样，字型、颜&nbsp;<BR>色等都不会改变。&nbsp;<BR><BR>外挂篇：&nbsp;<BR>外挂安装：将外挂包下载回来后，将其解压缩后，您会发现features、&nbsp;<BR>plugins这2个数据夹，将里面的东西都复制或移动到Eclipse的features&nbsp;<BR>、plugins数据夹内后，重新启动Eclipse即可。&nbsp;<BR><BR>让Eclipse可以像JBuilderX一样使用拖拉方式建构GUI的外挂：&nbsp;<BR>1.Jigloo&nbsp;SWT/Swing&nbsp;GUI&nbsp;Builder&nbsp;：&nbsp;<BR><A href="http://cloudgarden.com/jigloo/index.html&nbsp;">http://cloudgarden.com/jigloo/index.html&nbsp;</A>;<BR>下载此版本：Jigloo&nbsp;plugin&nbsp;for&nbsp;Eclipse&nbsp;(using&nbsp;Java&nbsp;1.4&nbsp;or&nbsp;1.5)&nbsp;<BR>安装后即可由档案-&gt;新建-&gt;其它-&gt;GUI&nbsp;Form选取要建构的GUI类型。&nbsp;<BR><BR>2.Eclipse&nbsp;Visual&nbsp;Editor&nbsp;Project：&nbsp;<BR><A href="http://www.eclipse.org/vep/&nbsp;">http://www.eclipse.org/vep/&nbsp;</A>;<BR>点选下方Download&nbsp;Page，再点选Latest&nbsp;Release&nbsp;0.5.0进入下载。&nbsp;<BR>除了VE-runtime-0.5.0.zip要下载外，以下这2个也要：&nbsp;<BR>EMF&nbsp;build&nbsp;1.1.1:&nbsp;(build&nbsp;page)&nbsp;(download&nbsp;zip)&nbsp;<BR>GEF&nbsp;Build&nbsp;2.1.2:&nbsp;(build&nbsp;page)&nbsp;(download&nbsp;zip)&nbsp;<BR><BR>3.0&nbsp;M8版本，请下载：&nbsp;<BR>EMF&nbsp;build&nbsp;I200403250631&nbsp;<BR>GEF&nbsp;Build&nbsp;I20040330&nbsp;<BR>VE-runtime-1.0M1&nbsp;<BR><BR>安装成功后，便可由File-&gt;New-&gt;Visual&nbsp;Class开始UI设计。&nbsp;<BR>安装成功后，即可由新建-&gt;Java-&gt;AWT与Swing里选择&nbsp;<BR>所要建构的GUI类型开始进行设计。VE必须配合着对应&nbsp;<BR>版本，才能正常使用，否则即使安装成功，使用上仍会&nbsp;<BR>有问题。&nbsp;<BR><BR>使用Eclipse来开发JSP程序：&nbsp;<BR>外挂名称：lomboz(下载页面)&nbsp;<BR><A href="http://forge.objectweb.org/project/showfiles.php?group_id=97&nbsp;">http://forge.objectweb.org/project/showfiles.php?group_id=97&nbsp;</A>;<BR>请选择适合自己版本的lomboz下载，lomboz.212.p1.zip表示2.1.2版，&nbsp;<BR>lomboz.3m7.zip表示M7版本....以此类推。&nbsp;<BR>lomboz安装以及设置教学：&nbsp;<BR>Eclipse开发JSP-教学文件&nbsp;<BR><BR>Java转exe篇：&nbsp;<BR>实现方式：Eclipse搭配JSmooth(免费)。&nbsp;<BR>1.先由Eclipse制作包含Manifest的JAR。&nbsp;<BR>制作教学&nbsp;<BR>2.使用JSmooth将做好的JAR包装成EXE。&nbsp;<BR>JSmooth下载页面：&nbsp;<BR><A href="http://jsmooth.sourceforge.net/index.php&nbsp;">http://jsmooth.sourceforge.net/index.php&nbsp;</A>;<BR>3.制作完成的exe文件，可在有装置JRE的Windows上执行。&nbsp;<BR><BR>Eclipse-Java编辑器最佳设定：&nbsp;<BR>编辑器字型设定：工作台-&gt;字型-&gt;Java编辑器文字字型。&nbsp;<BR>(建议设定Courier&nbsp;New&nbsp;-regular&nbsp;10)&nbsp;<BR><BR>编辑器相关设定：窗口-&gt;喜好设定-&gt;Java-&gt;编辑器&nbsp;<BR><BR>外观：显示行号、强调对称显示的方括号、强调显示现行行、&nbsp;<BR>显示打印边距，将其勾选，Tab宽度设4，打印编距字段设80。&nbsp;<BR>程序代码协助：采预设即可。&nbsp;<BR>语法：可设定关键词、字符串等等的显示颜色。&nbsp;<BR>附注：采预设即可。&nbsp;<BR>输入：全部字段都勾选。&nbsp;<BR>浮动说明：采预设即可。&nbsp;<BR>导览：采预设即可。&nbsp;<BR><BR>使自动排版排出来的效果，最符合Java设计惯例的设定：&nbsp;<BR>自动排版设定：窗口-&gt;喜好设定-&gt;Java-&gt;程序代码制作格式。&nbsp;<BR><BR>换行：全部不勾选。&nbsp;<BR>分行：行长度上限设：80。&nbsp;<BR>样式：只将强制转型后插入空白勾选。&nbsp;<BR>内缩空格数目：设为4。&nbsp;<BR><BR>Eclipse的教学文件：&nbsp;<BR>Eclipse&nbsp;3.0系列热键表&nbsp;-&nbsp;中英对照解说版&nbsp;(by&nbsp;sungo)&nbsp;~New~&nbsp;<BR>Window+GCC+CDT用Eclipse开发C、C++&nbsp;(by&nbsp;sungo)&nbsp;~New~&nbsp;<BR><BR>其它：&nbsp;<BR>扩充Eclipse的Java&nbsp;开发工具(中文)&nbsp;<BR>使用Eclipse开发J2EE&nbsp;应用程序(中文)&nbsp;<BR>使用Eclipse平台进行除错(中文)&nbsp;<BR>用Eclipse进行XML&nbsp;开发(中文)&nbsp;<BR>开发Eclipse外挂程序(中文)&nbsp;<BR>国际化您的Eclipse外挂程序(英文)&nbsp;<BR>将Swing编辑器加入Eclipse(英文)&nbsp;<BR>如何测试你的Eclipse&nbsp;plug-in符合国际市场需求(英文)&nbsp;<BR><BR>Eclipse的相关网站：&nbsp;<BR><A href="http://eclipse-plugins.2y.net/eclipse/index.jsp&nbsp;">http://eclipse-plugins.2y.net/eclipse/index.jsp&nbsp;</A>;<BR><A href="http://www.eclipseplugincentral.com/&nbsp;">http://www.eclipseplugincentral.com/&nbsp;</A>;<BR>Eclipse相关教学[简体]&nbsp;<BR><BR>&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;<BR><BR>写程序写到很累了，想休息一下？？玩玩小Game是&nbsp;<BR>不错的选择，下面介绍使用Eclipse玩Game的Plug-in。&nbsp;<BR><BR>补充外挂篇：&nbsp;<BR>Eclipse-Games：&nbsp;<BR><A href="http://eclipse-games.sourceforge.net/&nbsp;">http://eclipse-games.sourceforge.net/&nbsp;</A>;<BR>版本选：Latest&nbsp;Release&nbsp;3.0.1&nbsp;(Release&nbsp;Notes)&nbsp;Sat,&nbsp;3&nbsp;Jan&nbsp;2004&nbsp;<BR><BR>外挂安装完后，重新开启Eclipse。&nbsp;<BR>窗口-&gt;自订视景-&gt;其它-&gt;勾选Game&nbsp;Actions。&nbsp;<BR>再将Eclipse关闭，重新再启动，就可以开始玩噜。&nbsp;<BR>(共有4种：采地雷I、采地雷II、贪食蛇、仓库番。)&nbsp;<BR><BR>(Eclipse&nbsp;2.1.2&nbsp;+中文化&nbsp;玩Game&nbsp;-仓库番)&nbsp;&nbsp;&nbsp;<BR><BR>补充：(于Eclipse使用assertion机制)&nbsp;<BR>Eclipse版本：2.1.3&nbsp;release。&nbsp;<BR><BR>JDK1.4版新加入的assertion机制(关键词：assert)，由于JDK1.4编译器&nbsp;<BR>预设是兼容1.3，所以要使用assert必须在编译时加上-source&nbsp;1.4的参数。&nbsp;<BR><BR>C:\&gt;javac&nbsp;-source&nbsp;1.4&nbsp;XXX.java<BR>执行时则必须加-ea&nbsp;或-enableassertions参数启动。&nbsp;<BR><BR>C:\&gt;java&nbsp;-ea&nbsp;XXX<BR><BR>如要在Eclipse中使用assertion机制，请作以下设定：&nbsp;<BR>设定一：(编译设定)&nbsp;<BR>Windows-&gt;Preferance-&gt;Java-&gt;Compiler-&gt;Compliance&nbsp;and&nbsp;Classfiles&nbsp;<BR>页面。将..JDK&nbsp;Compliance&nbsp;level-&gt;Compiler&nbsp;compliance&nbsp;level调成1.4。&nbsp;<BR><BR>设定二：(执行设定)&nbsp;<BR>Run-&gt;Run-&gt;(x)=Arguments页面，在VM&nbsp;arguments加入-da参数，按下&nbsp;<BR>Run&nbsp;button便可看到启动assertion后的执行结果。&nbsp;<BR><BR>(Eclipse&nbsp;2.1.3&nbsp;release&nbsp;+&nbsp;assertion测试)&nbsp;<BR>&lt;assert判别为false，所以show出AssertionError&gt;&nbsp;&nbsp;&nbsp;<BR><BR>新版(m8+)的eclipse可以设vm&nbsp;arguments&nbsp;<BR>另外提供一种设法，是在eclipse启动时加入vm&nbsp;arguments(跟加大eclipse预设内存大小的方式一样)&nbsp;<BR>这样就不用每次run都得需去设vm&nbsp;arguments&nbsp; </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/zuroc/aggbug/1701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-04 23:17 <a href="http://www.blogjava.net/zuroc/archive/2005/03/04/1701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Java输出PDF格式</title><link>http://www.blogjava.net/zuroc/archive/2005/03/04/1698.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Fri, 04 Mar 2005 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/04/1698.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1698.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/04/1698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1698.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1698.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;iText使用指南 iText使用指南----------使用iText输出PDF文件。前言如今PDF格式文档的使用已经越来越普遍，它在文档压缩、安全等方面都表现的非常优秀，有关它的好处我就不在这里多说了。那么如何使用Java语言开发应用来输出PDF格式的文档呢？答案就是iText，它是一个开发源代码的项目，你可以使用iText方便的实现PDF的输出。这篇文章我将向...&nbsp;&nbsp;<a href='http://www.blogjava.net/zuroc/archive/2005/03/04/1698.html'>阅读全文</a><img src ="http://www.blogjava.net/zuroc/aggbug/1698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-04 23:05 <a href="http://www.blogjava.net/zuroc/archive/2005/03/04/1698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些好用的Eclipse 3.0插件 2004-08-21 </title><link>http://www.blogjava.net/zuroc/archive/2005/03/04/1697.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Fri, 04 Mar 2005 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/04/1697.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1697.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/04/1697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1697.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<DIV class=dititle>一些好用的Eclipse 3.0插件 2004-08-21</DIV></TD></TR>
<TR>
<TD class=diarybody2 width="100%"><A href="http://shaofan.blogbus.com/logs/2004/08/341035.html">http://shaofan.blogbus.com/logs/2004/08/341035.html</A><BR>
<DIV>&nbsp;</DIV>
<DIV>1.MyEclipse&nbsp; J2EE开发插件，支持SERVLET/JSP/EJB/数据库操纵等<BR><A href="http://www.myeclipseide.com/"><FONT color=#4a664d>www.myeclipseide.com</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>2.Properties Editor&nbsp; 编辑java的属性文件，并可以自动存盘为Unicode格式<BR><A href="http://propedit.sourceforge.jp/index_en.html"><FONT color=#4a664d>http://propedit.sourceforge.jp/index_en.html</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>3.Colorer Take&nbsp; 为上百种类型的文件按语法着色<BR><A href="http://colorer.sourceforge.net/"><FONT color=#4a664d>http://colorer.sourceforge.net/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>4.XMLBuddy 编辑xml文件<BR><A href="http://www.xmlbuddy.com/"><FONT color=#4a664d>www.xmlbuddy.com</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>5.Code Folding&nbsp; 加入多种代码折叠功能（比eclipse自带的更多）<BR><A href="http://www.coffee-bytes.com/servlet/PlatformSupport"><FONT color=#4a664d>http://www.coffee-bytes.com/servlet/PlatformSupport</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>6.Easy Explorer&nbsp; 从eclipse中访问选定文件、目录所在的文件夹<BR><A href="http://easystruts.sourceforge.net/"><FONT color=#4a664d>http://easystruts.sourceforge.net/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>7.Fat Jar 打包插件，可以方便的完成各种打包任务，可以包含外部的包等<BR><A href="http://fjep.sourceforge.net/"><FONT color=#4a664d>http://fjep.sourceforge.net/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>8.RegEx Test 测试正则表达式<BR><A href="http://brosinski.com/stephan/archives/000028.php"><FONT color=#4a664d>http://brosinski.com/stephan/archives/000028.php</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>9.JasperAssistant 报表插件（强，要钱的）<BR><A href="http://www.jasperassistant.com/"><FONT color=#4a664d>http://www.jasperassistant.com/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>10.Jigloo GUI Builder ＪＡＶＡ的ＧＵＩ编辑插件<BR><A href="http://cloudgarden.com/jigloo/"><FONT color=#4a664d>http://cloudgarden.com/jigloo/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>11.Profiler 性能跟踪、测量工具，能跟踪、测量ＢＳ程序<BR><A href="http://sourceforge.net/projects/eclipsecolorer/"><FONT color=#4a664d>http://sourceforge.net/projects/eclipsecolorer/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>12.AdvanQas 提供对if/else等条件语句的提示和快捷帮助（自动更改结构等）<BR><A href="http://eclipsecolorer.sourceforge.net/advanqas/index.html"><FONT color=#4a664d>http://eclipsecolorer.sourceforge.net/advanqas/index.html</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>13.Log4E&nbsp;&nbsp;&nbsp;&nbsp; Log4j插件，提供各种和Log4j相关的任务，如为方法、类添加一个logger等<BR><A href="http://log4e.jayefem.de/index.php/Main_Page"><FONT color=#4a664d>http://log4e.jayefem.de/index.php/Main_Page</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>14.VSSPlugin VSS插件<BR><A href="http://sourceforge.net/projects/vssplugin"><FONT color=#4a664d>http://sourceforge.net/projects/vssplugin</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>15.Implementors&nbsp;&nbsp; 提供跳转到一个方法的实现类，而不是接中的功能（实用!）<BR><A href="http://eclipse-tools.sourceforge.net/implementors/"><FONT color=#4a664d>http://eclipse-tools.sourceforge.net/implementors/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>16.Call Hierarchy 显示一个方法的调用层次（被哪些方法调，调了哪些方法）<BR><A href="http://eclipse-tools.sourceforge.net/call-hierarchy/index.html"><FONT color=#4a664d>http://eclipse-tools.sourceforge.net/call-hierarchy/index.html</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>17.EclipseTidy 检查和格式化HTML/XML文件<BR><A href="http://eclipsetidy.sourceforge.net/"><FONT color=#4a664d>http://eclipsetidy.sourceforge.net/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>18.Checkclipse 检查代码的风格、写法是否符合规范<BR><A href="http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm"><FONT color=#4a664d>http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>19.Hibernate Synchronizer Hibernate插件，自动映射等<BR><A href="http://www.binamics.com/hibernatesync/"><FONT color=#4a664d>http://www.binamics.com/hibernatesync/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>20.VeloEclipse&nbsp; Velocity插件<BR><A href="http://propsorter.sourceforge.net/"><FONT color=#4a664d>http://propsorter.sourceforge.net/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>21.EditorList&nbsp;&nbsp; 方便的列出所有打开的Editor<BR><A href="http://editorlist.sourceforge.net/"><FONT color=#4a664d>http://editorlist.sourceforge.net/</FONT></A></DIV>
<DIV><FONT color=#4a664d></FONT>&nbsp;</DIV>
<DIV>22.MemoryManager 内存占用率的监视<BR><A href="http://cloudgarden.com/memorymanager/"><FONT color=#4a664d>http://cloudgarden.com/memorymanager/</FONT></A></DIV></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/zuroc/aggbug/1697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-04 23:00 <a href="http://www.blogjava.net/zuroc/archive/2005/03/04/1697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMF资源</title><link>http://www.blogjava.net/zuroc/archive/2005/03/04/1696.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Fri, 04 Mar 2005 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/03/04/1696.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1696.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/03/04/1696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1696.html</trackback:ping><description><![CDATA[<H2 class=diaryTitle>JMF资源&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </H2>
<P>
<DIV>JMF（Java Media Framework）可以让基于JAVA的应用实现音频、视频的捕捉、处理、播放、传输等功能。利用它，可以实现音、视频播放，网络视频聊天、视频会议等功能。</DIV>
<DIV>下面是它的一些资源：</DIV>
<DIV><A href="http://java.sun.com/products/java-media/jmf/index.jsp" target=_blank>http://java.sun.com/products/java-media/jmf/index.jsp</A>：它在sun的老家</DIV>
<DIV><A href="http://forum.java.sun.com/forum.jsp?forum=28">http://forum.java.sun.com/forum.jsp?forum=28</A>：sun为它开设的论坛</DIV>
<DIV><A href="http://java.sun.com/products/java-media/jmf/2.1.1/solutions/">http://java.sun.com/products/java-media/jmf/2.1.1/solutions/</A>：示例解决方案，在这里，有很多例子。</DIV>
<DIV><A href="http://java.sun.com/products/java-media/jmf/2.1.1/download.html">http://java.sun.com/products/java-media/jmf/2.1.1/download.html</A>：SDK的下载</DIV>
<DIV><A href="http://wwws.sun.com/software/communitysource/jmf/download.html">http://wwws.sun.com/software/communitysource/jmf/download.html</A>：源代码的下载，好像只有javax.media部分（利用它可以看到2.11的文档）</DIV>
<DIV><A href="http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html">http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html</A>：文档下载（2.0）</DIV>
<DIV><A href="http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html">http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html</A>：编程指南（2.0）</DIV>
<DIV><A href="http://java.sun.com/products/java-media/jmf/2.1.1/apidocs/">http://java.sun.com/products/java-media/jmf/2.1.1/apidocs/</A>：2.11的文档</DIV>
<DIV>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</DIV>
<DIV><A href="http://www.uwasa.fi/~ksa/mm/mediatem.htm">http://www.uwasa.fi/~ksa/mm/mediatem.htm</A>：呵呵，相对比较全面了。</DIV>
<DIV><A href="http://www.jmfapi.org/">http://www.jmfapi.org/</A>：一些很老的资源</DIV>
<DIV>注明：有些类在下载的2.0的文档中找不到，如RTPManager，可以在2.11e的online document或者2.11e的source code中找到。</DIV>
<DIV>将source code中的javax.media部分拖入jdk source code的压缩包就可以在eclipse或者别的工具中看到源代码了－－也可以看到文档。</DIV>
<DIV>&nbsp;</DIV>
<DIV>这里只是一个初步介绍，以后我会慢慢的作进一步的介绍。主要是Jmf的文档很少，且都是e文。</DIV><img src ="http://www.blogjava.net/zuroc/aggbug/1696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-03-04 22:44 <a href="http://www.blogjava.net/zuroc/archive/2005/03/04/1696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我搞了一个开源的项目</title><link>http://www.blogjava.net/zuroc/archive/2005/02/15/1225.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Tue, 15 Feb 2005 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/02/15/1225.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1225.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/02/15/1225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1225.html</trackback:ping><description><![CDATA[我搞了一个开源的项目，网址<A href="http://akenxp.gro.clinux.org/" herf="http://akenxp.gro.clinux.org">http://akenxp.gro.clinux.org</A>目前还是计划阶段，欢迎大家加盟。<BR>
<P><A herf="" akenxp.gro.clinux.org="" http:><BR></A></P><img src ="http://www.blogjava.net/zuroc/aggbug/1225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-02-15 16:38 <a href="http://www.blogjava.net/zuroc/archive/2005/02/15/1225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重新做人，学Java</title><link>http://www.blogjava.net/zuroc/archive/2005/02/11/1072.html</link><dc:creator>AK747</dc:creator><author>AK747</author><pubDate>Thu, 10 Feb 2005 21:07:00 GMT</pubDate><guid>http://www.blogjava.net/zuroc/archive/2005/02/11/1072.html</guid><wfw:comment>http://www.blogjava.net/zuroc/comments/1072.html</wfw:comment><comments>http://www.blogjava.net/zuroc/archive/2005/02/11/1072.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zuroc/comments/commentRss/1072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuroc/services/trackbacks/1072.html</trackback:ping><description><![CDATA[<font style="font-family: times new roman;" size="6">在看了N（N&gt;=10）本厚厚的VB.net的书后，才发现，<br>
<br>
&nbsp;.Net如此垃圾，（主要是在.NET上开源大项目太少，<br>
<br>
支持.NET的手机太少，Linux下的</font><a href="http://www.zdnet.com.cn/developer/news/story/0,2000081594,20032287-1,00.htm" target="_blank"><font color="#e10900">Mono</font>工程<span style="font-family: times new roman;"></span></a><font style="font-family: times new roman;" size="6"> 居然不支持<br>
<br>
VB.NET，VC++.NET的移植性不好,Java代码可以转<br>
<br>
换为.net程序）。决心重新做人，学Java。用eMule下<br>
<br>
载了Java.Studio.Enterprise.6.0（企业版），还望大家<br>
<br>
多多指教。<br>
<br>
大学不能荒废啊，看国外的高手大都大二就退学了，<br>
<br>
我大一都过半学期了，</font><font style="font-family: times new roman;" size="6">唉</font>........................................
<script language="JavaScript">
    var __cc_uid="ZUROC";
</script><script language="JavaScript"
    src="http://count.hd-cn.net/count/count.js">
</script>
<a href="http://ak747.supbbs.com">我的论坛</a>
<A href="http://www.blogjava.net/zuroc/archive/2005/02/11/1071.html">网址</a>
<img src=/images/blogjava_net/zuroc/%E4%B8%AA%E4%BA%BA/xiao.jpg>
<img src=http://www.danasoft.com/sig-chi.jpg><img src ="http://www.blogjava.net/zuroc/aggbug/1072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuroc/" target="_blank">AK747</a> 2005-02-11 05:07 <a href="http://www.blogjava.net/zuroc/archive/2005/02/11/1072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>