网络博客

sleep wait
sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行,例如:

try{
System.out.println("I'm going to bed");
Thread.sleep(1000);
System.out.println("I wake up");
}
catch(IntrruptedException e) {
}


wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者,例如:


//Thread 1

try{
obj.wait();//suspend thread until obj.notify() is called
}
catch(InterrputedException e) {
}20:30 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志程序
程序目的
给定多个源程序文件,统计每个源程序的物理行数、逻辑行数(非注释行)和注释行数;以及所有文件上述三种统计值的总计值。
如果一行内有超过一处行内注释,则本行可以同时算作逻辑行和注释行。
程序输入
1个以上的文件名。
程序输出
根据命令行参数不同,可以分别得到下面两种输出:
1.  纯文本输出。
2.  HTML表格输出。
具体输出的格式由程序员从用户角度考虑,自行设计。
其他要求
1.  同时:如果是多个文件,则每一个文件的统计需要同时进行。(线程)
2.  易于扩充:程序未来可能需要扩充,比如其他输出格式。
定义
被统计的源文件是合法(编译器可编译通过)的文件。
给定多个源程序文件,统计每个源程序的物理行数、逻辑行数(非注释行)和注释行数;以及所有文件上述三种统计值的总计值。
如果一行内有超过一处行内注释,则本行可以同时算作逻辑行和注释行。
程序输入
1个以上的文件名。
程序输出
根据命令行参数不同,可以分别得到下面两种输出:
1.  纯文本输出。
2.  HTML表格输出。
具体输出的格式由程序员从用户角度考虑,自行设计。
其他要求
1.  同时:如果是多个文件,则每一个文件的统计需要同时进行。(线程)
2.  易于扩充:程序未来可能需要扩充,比如其他输出格式。
定义
被统计的源文件是合法(编译器可编译通过)的文件。20:10 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志ArrayList
ArrayList
  System.Collections.ArrayList类是一个特殊的数组。通过添加和删除元素,就可以动态改变数组的长度。

一.优点

1。支持自动改变大小的功能

2。可以灵活的插入元素

3。可以灵活的删除元素

二.局限性

跟一般的数组比起来,速度上差些

三.添加元素

1.  public virtual int Add(object value);

将对象添加到 ArrayList 的结尾处

ArrayList aList = new ArrayList();

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");

内容为a b c d e

2.  public virtual void Insert(int index,object value);

  将元素插入 ArrayList 的指定索引处

ArrayList aList = new ArrayList();

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");

aList.Insert(0,"aa");

结果为aa a b  c d e

3.  public virtual void InsertRange(int index,ICollection c);

   将集合中的某个元素插入 ArrayList 的指定索引处

  ArrayList aList = new ArrayList();

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");

ArrayList list2 = new ArrayList();

        list2.Add("tt");

list2.Add("ttt");

aList.InsertRange(2,list2);

结果为a b tt ttt c d e

四.删除

a)       public virtual void Remove(object obj);

   从 ArrayList 中移除特定对象的第一个匹配项,注意是第一个

ArrayList aList = new ArrayList();

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");

aList.Remove("a");

结果为b c d e

2. public virtual void RemoveAt(int index);

移除 ArrayList 的指定索引处的元素

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");

aList.RemoveAt(0);

结果为b c d e

3.  public virtual void RemoveRange(int index,int count);

从 ArrayList 中移除一定范围的元素。

Index表示索引,count表示从索引处开始的数目

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");

aList.RemoveRange(1,3);

结果为a e

4.  public virtual void Clear();

从 ArrayList 中移除所有元素。

五.排序

a)       public virtual void Sort();

对 ArrayList 或它的一部分中的元素进行排序。

ArrayList aList = new ArrayList();

aList.Add("e");

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

DropDownList1.DataSource = aList;  // DropDownList DropDownList1;

DropDownList1.DataBind();

结果为e a b c d

ArrayList aList = new ArrayList();

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");

aList.Sort();  //排序

DropDownList1.DataSource = aList;  // DropDownList DropDownList1;

DropDownList1.DataBind();

结果为a b c d e

b)       public virtual void Reverse();

将 ArrayList 或它的一部分中元素的顺序反转。

ArrayList aList = new ArrayList();

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");

aList.Reverse();  //反转

DropDownList1.DataSource = aList;  // DropDownList DropDownList1;

DropDownList1.DataBind();

结果为 e d c b a

六.查找

a)       public virtual int IndexOf(object);

b)       public virtual int IndexOf(object, int);

c)       public virtual int IndexOf(object, int, int);

  返回 ArrayList 或它的一部分中某个值的第一个匹配项的从零开始的索引。没找到返回-1。

ArrayList aList = new ArrayList();

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");

int nIndex = aList.IndexOf(“a”);  //1

nIndex = aList.IndexOf(“p”);     //没找到,-1

d)       public virtual int LastIndexOf(object);

e)         public virtual int LastIndexOf(object, int);

f)         public virtual int LastIndexOf(object, int, int);

  返回 ArrayList 或它的一部分中某个值的最后一个匹配项的从零开始的索引。

ArrayList aList = new ArrayList();

aList.Add("a"); 

aList.Add("b");

aList.Add("a");  //同0

aList.Add("d");

aList.Add("e");

int nIndex = aList.LastIndexOf("a");  //值为2而不是0

g)       public virtual bool Contains(object item);

确定某个元素是否在 ArrayList 中。包含返回true,否则返回false

七.其他

1.public virtual int Capacity {get; set;}

获取或设置 ArrayList 可包含的元素数。

2.public virtual int Count {get;}

获取 ArrayList 中实际包含的元素数。

Capacity 是 ArrayList 可以存储的元素数。Count 是 ArrayList 中实际包含的元素数。Capacity 总是大于或等于 Count。如果在添加元素时,Count 超过 Capacity,则该列表的容量会通过自动重新分配内部数组加倍。

如果 Capacity 的值显式设置,则内部数组也需要重新分配以容纳指定的容量。如果 Capacity 被显式设置为 0,则公共语言运行库将其设置为默认容量。默认容量为 16。

在调用Clear后,Count为0,而此时Capacity切是默认容量16,而不是0

3.public virtual void TrimToSize();

将容量设置为 ArrayList 中元素的实际数量。

如果不向列表中添加新元素,则此方法可用于最小化列表的内存系统开销。

若要完全清除列表中的所有元素,请在调用 TrimToSize 之前调用 Clear 方法。截去空 ArrayList 会将 ArrayList 的容量设置为默认容量,而不是零。

ArrayList aList = new ArrayList();

aList.Add("a");

aList.Add("b");

aList.Add("c");

aList.Add("d");

aList.Add("e");  //Count = 5,Capacity=16,

aList.TrimToSize();  //Count=Capacity=5;

作者:  来源:CSDN  (责任编辑:webjx) 
Hashtable 类







一。介绍







   表示键/值对的集合,这些键/值对 根据键的哈希代码进行组织。







   提供快速的查询。元素的存储与顺序无关。不能在指定位置插入元素,因为它本身没有有效的排序。感觉它的优点体现在查询上。







   hashtable的键必须是唯一的,没有有效的排序,它进行的是内在的排序














public class Hashtable : IDictionary, ICollection, IEnumerable,







   ISerializable, IDeserializationCallback, ICloneable







每个元素是一个存储在 DictionaryEntry 对象中的键/值对。键不能为空引用(Visual Basic 中为 Nothing),但值可以。







注:所谓的DictionaryEntry 结构,就是定义可设置或检索的字典键值对,有一个Key属性,一个Value属性,分别代表键和值 







二。添加







Hashtable.Add 方法







public virtual void Add(    object key,   object value );







将带有指定键和值的元素添加到 Hashtable 中。







key 要添加的元素的键。value 要添加的元素的值。该值可以为空引用(Visual Basic 中为 Nothing)。







通过设置 Hashtable 中不存在的键的值,Item 属性也可用于添加新元素。例如:myCollection["myNonexistentKey"] = myValue。但是,如果指定的键已经存在于 Hashtable 中,设置 Item 属性将改写旧值。相比之下,Add 方法不修改现有元素。

Hashtable hTable = new Hashtable();







hTable.Add("1","a");







hTable.Add("2","b");







hTable.Add("3","c");







hTable.Add("4","d");







hTable.Add("5","e");







//hTable.Add("1","aaaaaaaaaaa");  //出错,因为已经有键“1”







hTable["1"] = "aaaaaaaaaaa";  //ok







DropDownList2.DataSource = hTable;







DropDownList2.DataTextField = "Key";







DropDownList2.DataValueField = "Value";







DropDownList2.DataBind(); 







二。删除







1。public virtual void Remove(   object key );







从 Hashtable 中移除带有指定键的元素。







如果 Hashtable 不包含带有指定键的元素,则 Hashtable 保持不变。不引发异常。







2。public virtual void Clear(); 从 Hashtable 中移除所有元素。







Count 设置为零。容量保持不变。














三。其他







1。public virtual ICollection Values {get;}







获取包含 Hashtable 中的值的 ICollection。







注:ICollection 接口,定义所有集合的大小、枚举数和同步方法。







Hashtable hTable = new Hashtable();







hTable.Add("1","a");







hTable.Add("2","b");







hTable.Add("3","c");







hTable.Add("4","d");







hTable.Add("5","e");







Label2.Text = "";







foreach (string strKey in hTable.Keys)  //遍历







{







Label2.Text += strKey;







Label2.Text += ",";







}














2。public virtual ICollection Keys {get;}







获取包含 Hashtable 中的键的 ICollection。







返回的 ICollection 不是静态副本;相反,ICollection 反向引用原始 Hashtable 中的键。














因此,对 Hashtable 的更改继续反映到 ICollection 中。














3。public virtual bool Contains(    object key );







确定 Hashtable 是否包含特定键。 







4。public virtual bool ContainsKey(    object key );







确定 Hashtable 是否包含特定键。与Contains同 







5。public virtual bool ContainsValue(   object value );







确定 Hashtable 是否包含特定值














6。public virtual int Count {get;}







获取包含在 Hashtable 中的键值对的数目  Hashtable示例
<%@ Page Language="C#" AutoEventWireup="True" Debug="true" %>
<s cript language="C#" runat="server">
void Page_Load(Object Sender,EventArgs e){
Hashtable HT_values=new Hashtable();
HT_values.Add("1234","Microsoft");
HT_values.Add("3210","IBM");
HT_values.Add("4321","SUN");
HT_values.Add("5623","Orlce");

MyDownList.DataSource=HT_values;
MyDownList.DataValueField="Key";
MyDownList.DataTextField="Value";

MyListBox.DataSource=HT_values;
MyListBox.DataValueField="Key";
MyListBox.DataTextField="Value";

MyDataGrid.DataSource=HT_values;

Page.DataBind();
}
</s cript>
<form id="Form_1" runat="server">
<asp:dropdownlist ID="MyDownList" runat="server"></asp:dropdownlist><br>
<asp:listbox ID="MyListBox" runat="server"></asp:listbox><br>
<asp:datagrid ID="MyDataGrid" runat="server" AutoGenerateColumns="false">
<columns>
  <asp:boundcolumn HeaderText="Key" DataField="Key"/>
  <asp:boundcolumn HeaderText="Value" DataField="Value"/>
</columns>
</asp:datagrid>
</form>

20:07 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志又回到韩国拉.心情是不一样拉
剩下几个月时间,对我来说非常的重要,有很多事情要做,我还是从前的我,依然....19:52 | 添加评论 | 阅读评论 (1) | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志11月22日
session
session对象介绍  session对象,实际上就是服务器与客户端之间的“会话”
    (1) session可以用来储存访问者的一些特定信息。主机服务器就是根据session来跟踪这些信息的。
    (2) session可以创建访问者信息容器。
    (3) session可以用来跟踪访问者的访问路径,从中挖掘有用的信息,如访问者的兴趣爱好、访问目的。
  用户在Web应用程序中访问同一页面时,session变量始终存在,当用户在应用程序的页之间跳转时,存储在session对象中的变量也不会清除,当然也可以使用session方法显式地结束一个会话和设置空闲会话的超时期限。

  session在JSP程序中是一个内置的对象
  每一个客户端都有一个session对象用来存放于这个客户端相关的数据。
  在JSP的程序中,通常不用任何代码,就可以直接使用session对象。不过为了确认,可以加入以下代码,以表示需要启动session功能。
  <%@ page session="true"%>
  如果设置上述的session值为false,则说明禁用session功能。
  session对象的类为HttpSession,它提供了很多使用的方法。

session对象的常用方法

getCreationTime  返回会话创建的时间 
getId  返回会话标识符 
getLastAccessTime  返回客户端上一次发送携带会话账号的时间 
getSessionContext  返回会话相连的上下文 
getValue  返回和应用层数据中指定名字相联系的对象 
getValueNames  返回和会话相连的应用层数据对象的名字 
invalidate  使会话无效,并将其从上下文中移出 
isNew  检查是否客户端参加了会话 
putValue  将指定的对象和使用指定名字的会话应用层数据相连 
removeValue  移去和会话应用层数据中指定名字相连的对象
22:05 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志javabean的属性
在J a v a B e a n s设计中,按照属性
的不同作用又细分为四类: Simple, Index, Bound与C o n s t r a i n e d属性。
1. Simple属性
Simple 属性表示伴随有一对g e t / s e t方法(C语言的过程或函数在J a v a程序中称为”方法”)的
变量。属性名与和该属性相关的g e t / s e t方法名对应。例如:如果有s e t X和g e t X方法,则暗指有一
个名为”X”的属性。如果有一个方法名为i s X,则通常暗指”X”是一个布尔属性(即X的值为
t r u e或f a l s e)。例如,在下面这个程序中:
public class alden1 extends Canvas {
string ourString= "Hello";
file://属/性名为ourString,类型为字符串
public alden1(){
file://alden1/()是alden1的构造函数,与C++中构造函数的意义相同
setBackground(Color.red);
setForeground(Color.blue);
}
/* "set"属性*/
public void setString(String newString) {
ourString=newString;
}
/* "get"属性*/
public String getString() {
return ourString;
}
}
2. Indexed属性
I n d e x e d属性表示一个数组值。使用与该属性对应的s e t / g e t方法可取得数组中的数值。该属
性也可一次设置或取得整个数组的值。例如:
public class alden2 extends Canvas {
int[] dataSet={1,2,3,4,5,6};
// dataSet是一个indexed属性
public alden2() {
setBackground(Color.red);
setForeground(Color.blue);
}
/* 设置整个数组 */
public void setDataSet(int[] x){
dataSet=x;
}
/* 设置数组中的单个元素值*/
public void setDataSet(int index, int x){
dataSet[index]=x;
}
/* 取得整个数组值*/
public int[] getDataSet(){
return dataSet;
}
/* 取得数组中的指定元素值*/
public int getDataSet(int x){
return dataSet[x];
}
}
3. Bound属性
B o u n d属性是指当该种属性的值发生变化时,要通知其他的对象。每次属性值改变时,这种
属性就触发一个P r o p e r t y C h a n g e事件(在J a v a程序中,事件也是一个对象)。事件中封装了属性名、
属性的原值、属性变化后的新值。这种事件传递到其他的B e a n s,至于接收事件的B e a n s应做什
么动作,由其自己定义。
当P u s h B u t t o n的b a c k g r o u n d属性与D i a l o g的b a c k g r o u n d属性绑定时,若P u s h B u t t o n的
b a c k g r o u n d属性发生变化,D i a l o g的b a c k g r o u n d属性也发生同样的变化。例如:
public class alden3 extends Canvas{
String ourString= "Hello";
file://ourString/是一个bound属性
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
/*Java是纯面向对象的语言,如果要使用某种方法则必须指明是要使用哪个对象的方法,在下面的程序中要进行点
火事件的操作,这种操作所使用的方法是在PropertyChangeSupport类中的。所以上面声明并实例化了一个
changes对象,在下面将使用changes的firePropertyChange方法来点火ourString的属性改变事件。*/
public void setString(string newString){
String oldString = ourString;
ourString = newString;
/* ourString的属性值已发生变化,于是接着点火属性改变事件*/
changes.firePropertyChange("ourString",oldString,newString);
}
public String getString(){
return ourString;
}
/** 以下代码是为开发工具所使用的。我们不能预知alden3将与哪些其他的Beans组合成为一个应用,无法预知若
alden3的ourString属性发生变化时有哪些其他的组件与此变化有关,因而alden3这个Beans要预留出一些接口
给开发工具,开发工具使用这些接口,把其他的JavaBeans对象与alden3挂接。*/
public void addPropertyChangeListener(PropertyChangeLisener l){
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l){
changes.removePropertyChangeListener(l);
}
通过上面的代码,开发工具调用c h a n g e s的a d d P r o p e r t y C h a n g e L i s t e n e r方法把其他J a v a B e a n注
册入o u r S t r i n g属性的监听者队列l中,l是一个Ve c t o r数组,可存储任何J a v a对象。开发工具也可
使用c h a n g e s的r e m o v e P r o p e r t y C h a n g e L i s t e n e r方法,从l中注销指定的对象,使a l d e n 3的o u r S t r i n g
属性的改变不再与这个对象有关。当然,当程序员手写代码编制程序时,也可直接调用这两个
方法,把其他J a v a对象与a l d e n 3挂接。
4. Constrained属性
J a v a B e a n s的Co n s t r a i n e d属性是指当这个属性的值要发生变化时,与这个属性已建立了某种连
接的其他J a v a对象可否决属性值的改变。Co n s t r a i n e d属性的监听者通过抛出P r o p e r t y Ve t o E x c e p t i o n
来阻止该属性值的改变。
例如:下面程序中的Co n s t r a i n e d属性是P r i c e I n C e n t s。
public class JellyBean extends Canvas{
private PropertyChangeSupport changes=new PropertyChangeSupport(this);
private VetoableChangeSupport Vetos=new VetoableChangeSupport(this);
/*与前述changes相同,可使用VetoableChangeSupport对象的实例Vetos中的方法,在特定条件下来阻
止PriceInCents值的改变。*/
......
public void setPriceInCents(int newPriceInCents) throws PropertyVetoException {
/* 方法名中throws PropertyVetoException的作用是当有其他Java对象否决PriceInCent
s的改变时,要抛出例外。*/
/* 先保存原来的属性值*/
int oldPriceInCents=ourPriceInCents;
/**点火属性改变否决事件*/
vetos.fireVetoableChange
("priceInCents",new Integer(OldPriceInCents), new Integer(newPriceInCents));
/**若有其他对象否决priceInCents的改变,则程序抛出例外,不再继续执行下面的两条语句,方法结束。若无其
他对象否决priceInCents的改变,则在下面的代码中把ourPriceIncents赋予新值,并点火属性改变事件*/
ourPriceInCents=newPriceInCents;
changes.firePropertyChange
("priceInCents", new Integer(oldPriceInCents),new Integer(newPriceInCents));
}
/**与前述changes相同,也要为PriceInCents属性预留接口,使其他对象可注册入PriceInCents否决改变监
听者队列中,或把该对象从中注销
public void addVetoableChangeListener(VetoableChangeListener l){
vetos.addVetoableChangeListener(l);
}
public void removeVetoableChangeListener(VetoableChangeListener l){
vetos.removeVetoableChangeListener(l);
}
......
}
从上面的例子中可看到,一个Co n s t r a i n e d属性有两种监听者:属性变化监听者和否决属性
改变的监听者。否决属性改变的监听者在自己的对象代码中有相应的控制语句,在监听到有
Co n s t r a i n e d属性要发生变化时,在控制语句中判断是否应否决这个属性值的改变。
总之,某个B e a n s的Co n s t r a i n e d属性值可否改变取决于其他的B e a n s或者是J a v a对象是否允许
这种改变。允许与否的条件由其他的B e a n s或J a v a对象在自己的类中进行定义。
10:50 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志11月21日
j2ee

用Eclipse3.1 + Myeclipse4.0 + Tomcat5.0 + j2sdk1.5 搭建J2EE开发环境
(by Robert Hu)


一、安装j2sdk1.5,设定环境变量。 
   我的安装目录是 D:\j2sdk 。 所以设定环境变量如下: 
   操作: My Computer(右键) ----> Properties ----> Advanced ----> Environment Variables : 

设定环境变量为:
   1. (新建)JAVA_HOME: D:\j2sdk
   2. (新建)CLASSPATH: .;D:\j2sdk\lib\dt.jar;D:\j2sdk\lib\tools.jar (注意:点号不能省略,表示当前目录)
   3. 编辑PATH的变量值,在后面加上 ;%JAVA_HOME%\bin (注意:要有分号隔开)


到这里,j2sdk安装完毕,用命令简单测试一下: java -version 

二、安装Tomcat5.0 
去下载一个Tomcat的zip版, 我用的是 jakarta-tomcat-5.0.28.zip , 不下安装版的目的是可以使用多个Tomcat。 
直接解压缩到 G 盘: 

三、安装Eclipse3.1 
下载地址:http://www.eclipse.org/downloads/index.php 找到下面的页面: 

找个亚洲的服务器下载,速度会快一点。在flashget中如下: 

直接解压缩就可以用了,我是解压缩在 G 盘: 

到这里, Eclipse3.1 安装完毕。 
四、安装 Myeclipse4.0 (myeclipse不是免费的,所以我们先下载一个试用版,再去网上下载一个注册机) 
下载版本: MyEclipse Enterprise Workbench 4.0 GA for Windows 98/2000/XP (8/29/2005) 如下图: 

在flashget下载中显示如下: 

下载完成后,开始安装: 
1. 选择你的eclipse所在目录,其它都点下一步,默认安装。 

2.安装完毕之后,找到myeclipse的安装目录, 如下图所示: 

3. 将features和plugins这2个目录复制出来。这样做的目的是为了在一台电脑上可以使用多个独立的eclipse开发平台。如下图所示: 

4. 将刚才安装的 myeclipse 删除(反安装)。 
5. 将第3步复制的features和plugins这2个目录, 覆盖到 G 

解释一下上面做的原因: 因为myeclipse是eclipse的插件,所以只要把features和plugins这2个目录覆盖在eclipse的相应目录,eclipse会自动认出这些插件。 
到这一步,myeclipse算是安装完毕。 G 盘目录如下: 

五、破解myeclipse4.0 
1.去google搜索下载一个注册机。如下图: 

2. 输入名字,算号,如下图: 

3.运行eclipse.exe, 设定同目录下的workspace, 如下图: 

4.myeclipse插件已经被自动认出,如下图: 

5. 点击 Window ----> Preferences ----> Subscription ----> Enter Subscription, 输入注册码,破解myeclipse,下图: 

到这里,myeclipse破解完毕。 
六、设定myeclipse的 jdk 和 tomcat 服务器。 
1. 增加一个jre, 点击 Window ----> Preferences ----> Installed JREs ----> Add 如下图:(找到自己的j2sdk安装目录) 

2. 指定Tomcat服务器,Window ----> Preferences ----> Tomcat5, 并设定该tomcat所用的jre为我们上一步新增的。如下面2个图: 


到这一步,我们的开发环境就搭建完毕了。 
七、新建一个项目来试一试? 
1. 点击 File ----> New ----> Project , 选择Web Project, 再点下一步, 如下图: 

2. 在 Project Name 中输入test, 点 finish。 如下图: 

3. 开发工具自动生成了test项目。 如下图: 

4.点击 WebRoot ----> (右键)New ----> JSP , 新建一个 JSP 页面 (hello.jsp), 如下图: 

5. 编辑器生成的是jsp文件是按模板生成的, 简单修改一下, 代码如下图: 

6. 再用同样的方法, 新建一个叫 hello_result.jsp 的JSP文件, 代码如下图: 

7. deploy(部署)这个test项目。 如下图: (用黑线画了的按钮就是 deploy 的按钮) , 在弹出窗口点 Add, 部署test项目。 

8. 启动Tomcat服务器。如下图: (用黑线画了的按钮就是 启动Tomcat 的按钮) 

9. Tomcat 启动输出信息如下图: 

10. 网页访问和结果图. 


到这里,终于搞完了!!!大家可以去eclipse的workspace目录下看看test项目的代码,也可以去Tomcat的webapps目录下,看看部署之后的 test项目的结构。
14:05 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志toefl
1.A and B look alike.
2.A looks like B.
3.awake,alive,asleep,aware,afraid,averse.
4.lone,upper,outer,latter.former.
5.so short a time .
6.as good a way as .
7.fish alive.
8.all the three pretty girls.
9.two more hours.
10.of.ingnorant,glad,conscious,convinced,(un)ware.
11.at.bad,amused,alarmed,surprised.puzzled.
12.to.averse,equal,subject,preferable,related.
13.low-voiced woman.
14.pear-shaped.
15.warm-blooded.
16.oil-produting country.
17.to.ability, decision,effect,refusal,revolution.
18.of.idea,hope,possibility,job,habit,
19.as a singer,he sang.
20.like a singer ,he sang.
21.be worth doing.
22.be worth while to do /doing.
23.be worth of n/to be done.
24.A is opposite(to) B.
25.need want be worth(doing /to be done).
12:18 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志11月20日
java 打印
Java打印程序设计

1 前言

在我们的实际工作中,经常需要实现打印功能。但由于历史原因,Java提供的打印功能一直都比较弱。实际上最初的jdk根本不支持打印,直到jdk1.1才引入了很轻量的打印支持。所以,在以前用Java/Applet/JSP/Servlet设计的程序中,较复杂的打印都是通过调用ActiveX/OCX控件或者VB/VC程序来实现的,非常麻烦。实际上,SUN公司也一直致力于Java打印功能的完善,而Java2平台则终于有了一个健壮的打印模式的开端,该打印模式与Java2D图形包充分结合成一体。更令人鼓舞的是,新发布的jdk1.4则提供了一套完整的"Java 打印服务 API" (Java Print Service API),它对已有的打印功能是积极的补充。利用它,我们可以实现大部分实际应用需求,包括打印文字、图形、文件及打印预览等等。本文将通过一个具体的程序实例来说明如何设计Java打印程序以实现这些功能,并对不同版本的实现方法进行分析比较,希望大家能从中获取一些有益的提示。

2 Java中的打印

2.1 Java的打印API

Java的打印API主要存在于java.awt.print包中。而jdk1.4新增的类则主要存在于javax.print包及其相应的子包javax.print.event和javax.print.attribute中。其中javax.print包中主要包含打印服务的相关类,而javax.print.event则包含打印事件的相关定义,javax.print.attribute则包括打印服务的可用属性列表等。

2.2 如何实现打印

要产生一个打印,至少需要考虑两条:

需要一个打印服务对象。这可通过三种方式实现:在jdk1.4之前的版本,必须要实现java.awt.print.Printable接口或通过Toolkit.getDefaultToolkit().getPrintJob来获取打印服务对象;在jdk1.4中则可以通过javax.print.PrintSerivceLookup来查找定位一个打印服务对象。
需要开始一个打印工作。这也有几种实现方法:在jdk1.4之前可以通过java.awt.print.PrintJob(jdk1.1提供的,现在已经很少用了)调用print或printAll方法开始打印工作;也可以通过java.awt.print.PrinterJob的printDialog显示打印对话框,然后通过print方法开始打印;在jdk1.4中则可以通过javax.print.ServiceUI的printDialog显示打印对话框,然后调用print方法开始一个打印工作。

2.3 打印机对话框

2.3.1 Printable的打印对话框

开始打印工作之前,可以通过PrinterJob.printDialog来显示一个打印对话框。它给用户一个机会以选择应该打印的页码范围,并可供用户改变打印设置。它是一个本地对话框。

事实上,当从一个Printable对象进行一个打印工作时,打印对象并不知道需要打印多少页。它只是不停地调用print方法。只要print方法返回Printable.PAGE_EXISTS值,打印工作就不停地产生打印页,直到print方法返回Printable.NO_SUCH_PAGE时,打印工作才停止。

由于打印工作只有在打印完成后才进行准确的页数计算,所以在对话框上的页码范围是尚未初始化的[1,9999]。我们可以通过构建一个java.awt.print.Book对象传递给打印对象;也可以通过指定的格式计算需要打印的页数并传递给打印对象,使其准确地知道要打印多少页。

2.3.2 ServiceUI的打印对话框

与Printable的对话框不同的是,在jdk1.4提供ServiceUI的打印机对话框的缺省行为已经用新的 API 更改了:缺省情况下对话框不显示。我们必须使用ServiceUI类调用printDialog方法创建如下所示的打印对话框。

3 Java打印程序设计实例

3.1 打印文本

3.1.1 应用场景

假设我们需要打印一个窗体的某个文本编辑域(可能只有几行,也可能包含多页)的内容,并且每页最多打印54行,如何实现呢?

3.1.2 解决方法

基本思路如下:首先我们需要实现Printable接口,然后按照每页最多54行的格式计算共需要打印多少页,当打印文本的按钮被点击时,执行相应的打印动作。打印文本的具体操作可通过Graphics2D的drawString方法来实现。

1、实现Printable接口

/*Graphic指明打印的图形环境;PageFormat指明打印页格式(页面大小以点为计量单位,1点为1英寸的1/72,1英寸为25.4毫米。A4纸大致为595×842点);page指明页号*/

public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
  Graphics2D g2 = (Graphics2D)g;
  g2.setPaint(Color.black); //设置打印颜色为黑色
  if (page >= PAGES) //当打印页号大于需要打印的总页数时,打印工作结束
    return Printable.NO_SUCH_PAGE;
  g2.translate(pf.getImageableX(), pf.getImageableY());//转换坐标,确定打印边界
  drawCurrentPageText(g2, pf, page); //打印当前页文本
  return Printable.PAGE_EXISTS; //存在打印页时,继续打印工作
}

/*打印指定页号的具体文本内容*/
private void drawCurrentPageText(Graphics2D g2, PageFormat pf, int page) {
  String s = getDrawText(printStr)[page]; //获取当前页的待打印文本内容
  //获取默认字体及相应的尺寸
  FontRenderContext context = g2.getFontRenderContext();
  Font f = area.getFont();
  String drawText;
  float ascent = 16; //给定字符点阵
  int k, i = f.getSize(), lines = 0;
  while(s.length() > 0 && lines < 54) //每页限定在54行以内
  {
    k = s.indexOf('\n'); //获取每一个回车符的位置
    if (k != -1)  //存在回车符
    {
      lines += 1; //计算行数
      drawText = s.substring(0, k); //获取每一行文本
      g2.drawString(drawText, 0, ascent); //具体打印每一行文本,同时走纸移位
      if (s.substring(k + 1).length() > 0) {
          s = s.substring(k + 1); //截取尚未打印的文本
        ascent += i;
      }
    }
    else //不存在回车符
    {
      lines += 1; //计算行数
      drawText = s; //获取每一行文本
      g2.drawString(drawText, 0, ascent); //具体打印每一行文本,同时走纸移位
      s = ""; //文本已结束
    }
  }
}

/*将打印目标文本按页存放为字符串数组*/
public String[] getDrawText(String s) {
  String[] drawText = new String[PAGES]; //根据页数初始化数组
  for (int i = 0; i < PAGES; i++)
    drawText[i] = ""; //数组元素初始化为空字符串
  int k, suffix = 0, lines = 0;
  while (s.length() > 0) {
    if (lines < 54) //不够一页时
    {
      k = s.indexOf('\n');
      if (k != -1) //存在回车符
      {
        lines += 1; //行数累加
    //计算该页的具体文本内容,存放到相应下标的数组元素
        drawText[suffix] = drawText[suffix] + s.substring(0, k + 1);
        if (s.substring(k + 1).length() > 0)
          s = s.substring(k + 1);
      }
      else
      {
        lines += 1; //行数累加
    //将文本内容存放到相应的数组元素
        drawText[suffix] = drawText[suffix] + s;
        s = "";
      }
    }
    else //已满一页时
    {
      lines = 0; //行数统计清零
      suffix++; //数组下标加1
    }
  }
  return drawText;
}

2、计算需要打印的总页数

public int getPagesCount(String curStr)    {
  int page = 0;
  int position, count = 0;
  String str = curStr;
  while(str.length() > 0) //文本尚未计算完毕
  {
    position = str.indexOf('\n'); //计算回车符的位置
    count += 1; //统计行数
    if (position != -1)
      str = str.substring(position + 1); //截取尚未计算的文本
    else
      str = ""; //文本已计算完毕
  }
  if (count > 0)
    page = count / 54 + 1; //以总行数除以54获取总页数
  return page; //返回需打印的总页数
}

3.1、以jdk1.4以前的版本实现打印动作按钮监听,并完成具体的打印操作

private void printTextAction() {
  printStr = area.getText().trim(); //获取需要打印的目标文本
  if (printStr != null && printStr.length() > 0) //当打印内容不为空时
  {
    PAGES = getPagesCount(printStr); //获取打印总页数
    PrinterJob myPrtJob = PrinterJob.getPrinterJob(); //获取默认打印作业
    PageFormat pageFormat = myPrtJob.defaultPage(); //获取默认打印页面格式
    myPrtJob.setPrintable(this, pageFormat); //设置打印工作
    if (myPrtJob.printDialog()) //显示打印对话框
    {
      try {
        myPrtJob.print(); //进行每一页的具体打印操作
      }
      catch(PrinterException pe) {
        pe.printStackTrace();
      }
    }
  }
  else { //如果打印内容为空时,提示用户打印将取消
    JOptionPane.showConfirmDialog(null, "Sorry, Printer Job is Empty, Print Cancelled!", "Empty", JOptionPane.DEFAULT_OPTION,                                   JOptionPane.WARNING_MESSAGE);
  }
}

3.2、以jdk1.4新版本提供的API实现打印动作按钮监听,并完成具体的打印操作

private void printText2Action() {
  printFlag = 0; //打印标志清零
  printStr = area.getText().trim();//获取需要打印的目标文本
  if (printStr != null && printStr.length() > 0) //当打印内容不为空时
  {
    PAGES = getPagesCount(printStr); //获取打印总页数
    //指定打印输出格式
    DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
    //定位默认的打印服务
    PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
    //创建打印作业
    DocPrintJob job = printService.createPrintJob();
    //设置打印属性
    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
    DocAttributeSet das = new HashDocAttributeSet();
    //指定打印内容
    Doc doc = new SimpleDoc(this, flavor, das);
    //不显示打印对话框,直接进行打印工作
    try {
      job.print(doc, pras); //进行每一页的具体打印操作
    }
    catch(PrintException pe) {
      pe.printStackTrace();
    }
  }
  else { //如果打印内容为空时,提示用户打印将取消
    JOptionPane.showConfirmDialog(null, "Sorry, Printer Job is Empty, Print Cancelled!", "Empty", JOptionPane.DEFAULT_OPTION,                                   JOptionPane.WARNING_MESSAGE);
  }
}

3.2 打印预览

3.2.1应用场景

大多少商业应用都需要提供打印预览机制,它可以让我们在屏幕上看到页面,这样就不会因为不喜欢的打印结果而浪费纸张。假设我们在打印上一节所说的文本之前,需要先进行打印预览。那么该怎么实现呢?

界面实现图示如下:(Next预览下一页,Preview预览前一页,Close则关闭预览)


3.2.2解决方法

基本思路:虽然Java2平台的打印API并不提供标准的打印预览对话框,但是自己来进行设计也并不复杂。正常情况下,print方法将页面环境绘制到一个打印机图形环境上,从而实现打印。而事实上,print方法并不能真正产生打印页面,它只是将待打印内容绘制到图形环境上。所以,我们可以忽略掉屏幕图形环境,经过适当的缩放比例,使整个打印页容纳在一个屏幕矩形里,从而实现精确的打印预览。

在打印预览的设计实现中,主要需要解决两个问题。
第一,如何将打印内容按合适的比例绘制到屏幕;
第二,如何实现前后翻页。
下面我给出这两个问题的具体实现方法,完整的实现请参看附件中的PrintPreviewDialog.java文件。

/*将待打印内容按比例绘制到屏幕*/
public void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D)g;
  PageFormat pf = PrinterJob.getPrinterJob().defaultPage(); //获取页面格式
  double xoff; //在屏幕上页面初始位置的水平偏移
  double yoff; //在屏幕上页面初始位置的垂直偏移
  double scale; //在屏幕上适合页面的比例
  double px = pf.getWidth(); //页面宽度
  double py = pf.getHeight(); //页面高度
  double sx = getWidth() - 1;
  double sy = getHeight() - 1;
  if (px/py < sx/sy) {
    scale = sy / py; //计算比例
    xoff = 0.5 * (sx - scale * px); //水平偏移量
    yoff = 0;
  }
  else {
    scale = sx / px; //计算比例
    xoff = 0;
    yoff = 0.5 * (sy - scale * py); //垂直偏移量
  }
  g2.translate((float)xoff, (float)yoff); //转换坐标
  g2.scale((float)scale, (float)scale);
  Rectangle2D page = new Rectangle2D.Double(0, 0, px, py); //绘制页面矩形
  g2.setPaint(Color.white); //设置页面背景为白色
  g2.fill(page);
  g2.setPaint(Color.black);//设置页面文字为黑色
  g2.draw(page);
  try {
    preview.print(g2, pf, currentPage); //显示指定的预览页面
  }
  catch(PrinterException pe) {
    g2.draw(new Line2D.Double(0, 0, px, py));
    g2.draw(new Line2D.Double(0, px, 0, py));
  }
}

/*预览指定的页面*/
public void viewPage(int pos) {
  int newPage = currentPage + pos;  //指定页面在实际的范围内
  if (0 <= newPage && newPage < preview.getPagesCount(printStr)) {
    currentPage = newPage; //将指定页面赋值为当前页
    repaint();
  }
}

这样,在按下"Next"按钮时,只需要调用canvas.viewPage(1);而在按下"Preview"按钮时,只需要调用canvas.viewPage(-1)即可实现预览的前后翻页。


3.3 打印图形

3.3.1应用场景

在实际应用中,我们还需要打印图形。譬如,我们有时需要将一个Java Applet的完整界面或一个应用程序窗体及其所包含的全部组件都打印出来,又应该如何实现呢?

3.3.2解决方法

基本思路如下:在Java的Component类及其派生类中都提供了print和printAll方法,只要设置好属性就可以直接调用这两个方法,从而实现对组件及图形的打印。

/*打印指定的窗体及其包含的组件*/
private void printFrameAction() {
  Toolkit kit = Toolkit.getDefaultToolkit(); //获取工具箱
  Properties props = new Properties();
  props.put("awt.print.printer", "durango"); //设置打印属性
  props.put("awt.print.numCopies", "2");
  if (kit != null) {
    //获取工具箱自带的打印对象
    PrintJob printJob = kit.getPrintJob(this, "Print Frame", props);
    if (printJob != null) {
      Graphics pg = printJob.getGraphics(); //获取打印对象的图形环境
      if (pg != null) {
        try {
          this.printAll(pg); //打印该窗体及其所有的组件
        }
        finally {
          pg.dispose(); //注销图形环境
        }
      }
      printJob.end(); //结束打印作业
    }
  }
}


3.4 打印文件

3.4.1应用场景

在很多实际应用情况下,我们可能都需要打印用户指定的某一个文件。该文件可能是图形文件,如GIF、JPEG等等;也可能是文本文件,如TXT、Java文件等等;还可能是复杂的PDF、DOC文件等等。那么对于这样的打印需求,我们又应该如何实现呢?

3.4.2解决方法

基本思路:在jdk1.4以前的版本,要实现这样的打印功能将非常麻烦和复杂,甚至是难以想象的。但幸运的是,jdk1.4的打印服务API提供了一整套的打印文件流的类和方法。利用它们,我们可以非常方便快捷地实现各式各样不同类型文件的打印功能。下面给出一个通用的处理方法。

/*打印指定的文件*/
private void printFileAction() {
  //构造一个文件选择器,默认为当前目录
  JFileChooser fileChooser = new JFileChooser(SystemProperties.USER_DIR);
  int state = fileChooser.showOpenDialog(this); //弹出文件选择对话框
  if (state == fileChooser.APPROVE_OPTION) //如果用户选定了文件
  {
    File file = fileChooser.getSelectedFile(); //获取选择的文件
    //构建打印请求属性集
    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
    //设置打印格式,因为未确定文件类型,这里选择AUTOSENSE
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
    //查找所有的可用打印服务
    PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
    //定位默认的打印服务
    PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
    //显示打印对话框
    PrintService service = ServiceUI.printDialog(null, 200, 200, printService, defaultService, flavor, pras);
    if (service != null) {
      try {
          DocPrintJob job = service.createPrintJob(); //创建打印作业
        FileInputStream fis = new FileInputStream(file); //构造待打印的文件流
        DocAttributeSet das = new HashDocAttributeSet();
        Doc doc = new SimpleDoc(fis, flavor, das); //建立打印文件格式
        job.print(doc, pras); //进行文件的打印
      }
      catch(Exception e) {
          e.printStackTrace();
      }
    }
  }
}

在上面的示例中,因尚未确定文件的类型,所以将指定文件的打印格式定义为DocFlavor.INPUT_STREAM.AUTOSENSE。事实上,如果在进行打印之前,就已确定地知道文件的格式,如为GIF,就应定义为DocFlavor.INPUT_STREAM.GIF ;如为PDF,就应该定义为DocFlavor.INPUT_STREAM.PDF;如为纯ASCII文件,就可以定义为 DocFlavor.INPUT_STREAM.TEXT_HTML_US_ASCII。等等。
jdk1.4的javax.print.DocFlavor提供了极为丰富的文件流类型,你可以根据具体的应用需求进行合适的选择。具体的API参考文档可见本文的参考资料3。


4 结束语

以上是本人在两年多J2EE应用开发中,总结的关于用Java进行打印程序设计的一些经验,希望能给大家一些启示和裨益。尽管目前用Java来实现打印功能与用Microsoft的MFC API相比确实有更多的麻烦。但jdk1.4的推出,对Java以前较弱的打印功能是一个极好的补充。相信大家如果能够很好地理解前文所述的打印程序设计实例,并加以应用和拓展,应该可以解决目前大部分应用的实际编程问题。而随着Java的进一步发展和完善,必将更好地充实其基础类库及打印API,相信用Java实现高级打印功能也将越来越不成为我们这些Java痴迷者头痛的问题。22:52 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志事件处理
2-1:事件处理:
Source                                    Event                                      Event Listener
--------------------------------------------------------------------------------------------------------------
AbstractButton                         ActionEvent                                  ActionListener
(JButton,JtoggleButton,                ChangeEvent                                  ChangeListener
JCheckBox,JRadioButton                 ItemEvent                                    ItemListener
-------------------------------------------------------------------------------------------------------
JTextField                             ActionEvent                                  ActionListener
JpasswordField                         CaretEvent                                   CaretListener
                                       DocumentEvent                                DocumentListener
                                       UndoableEvent                                UndoableListener
-------------------------------------------------------------------------------------------------------
JTextArea                              CaretEvent                                   CaretListener
                                       DocumentEvent                                DocumentListener
                                       UndoableEvent                                UndoableListener
-------------------------------------------------------------------------------------------------------
JTextPane                              CaretEvent                                   CaretListener
JEditorPane                            DocumentEvent                                DocumentListener
                                       UndoableEvent                                UndoableListener
                                       HyperlinkEvent                               HyperlinkListener
-------------------------------------------------------------------------------------------------------
JComboBox                              ActionEvent                                  ActionListener
                                       ItemEvent                                    ItemListener
-------------------------------------------------------------------------------------------------------
JList                                  ListSelectionEvent                           ListSelectionListener
                                       ListDataEvent                                ListDataListener
-------------------------------------------------------------------------------------------------------
JFileChooser                           ActionEvent                                  ActionListener
-------------------------------------------------------------------------------------------------------
JMenuItem                              ActionEvent                                  ActionListener
                                       ChangeEvent                                  ChangeListener
                                       ItemEvent                                    ItemListener
                                       MenuKeyEvent                                 MenuKeyListener
                                       MenuDragMouseEvent                           MenuDragMouseListener
-------------------------------------------------------------------------------------------------------
JMenu                                  MenuEvent                                    MenuListener
-------------------------------------------------------------------------------------------------------
JPopupMenu                             PopupMenuEvent                               PopupMenuListener
-------------------------------------------------------------------------------------------------------
JProgressBar                           ChangeEvent                                  ChangeListener
-------------------------------------------------------------------------------------------------------
JSlider                                ChangeEvent                                  ChangeListener
-------------------------------------------------------------------------------------------------------
JScrollBar                             AdjustmentEvent                              AdjustMentListener
-------------------------------------------------------------------------------------------------------
JTable                                 ListSelectionEvent                           ListSelectionListener
                                       TableModeEvent                               TableModeListener
                                       TableColumnModelEvent                        TableColumnModeListener
                                       CellEditorEvent                              CellEditorListener
-------------------------------------------------------------------------------------------------------
JTabbedPane                            ChangeEvent                                  ChangeListener
-------------------------------------------------------------------------------------------------------
JTree                                  TreeSelectionEvent                           TreeSelectionListener
                                       TreeExpansionEvent                           TreeExpansionListener
                                       TreeWillExpandEvent                          TreeWillExpandListener
                                       TreeModeEvent                                TreeModeListener    
-------------------------------------------------------------------------------------------------------
JTimer                                 ActionEvent                                  ActionListener
-------------------------------------------------------------------------------------------------------    
        底层事件:

---------------------------------------------------------------------------------------------------------------

     Event                                                                     Listener
  ComponentEvent                                                        ComponentListener
  ContainerEvent                                                        ConatainerListener
  FocusEvent                                                            FocusListener
  KeyEvent                                                              KeyListener
  MouseEvent                                                            MouseListener
  MouseMotionEvent                                                      MouseMotionListener
  WindowEvent                                                           WindowListener
ComponentEvent:主要处理组件大小的改变,位置的改变,或是可见与不可见状态(hidden or visible)等。
ContainerListener:主要在处理组件的加入或移出容器。
FocusListener:主要在处理焦点的取得或移开焦点等操作。
MouseListener:主要就是在处理鼠标是否在某个组件上,是否按下鼠标键,是否离开某个组件等操作,主要针对鼠标按键与位置
              作处理。
MouseMotionListener:主要就是在追踪鼠标的位置,如(X,Y)坐标的位置,主人是针对鼠标坐标与拖曳操作作处理。
WindowListener:主要在处理窗口的所有操作。如处理active窗口或是de-active窗口,处理窗口的最大、最小化,处理窗口的关闭
               、打开、退出等。

  以上所述的每种EventListener都是一种interface,里面只有定义这个EventListener的interface,然后在这个类中,把要处理事
件的程序代码写在此interface的方法中。这是处理事件的标准操作,当然还有其他编写模式,如:利用inner class的匿名类方法
,就可以不用在class后面加上implements EventListener的表示法,或是利用Adapter类,就不用一一将interface中的每种方法都
实现。
  让我们来了解一下,每一种EventListener的interface到底提供了哪几种方法要我们实现(Implement)!我们把事件区分成是由
Swing或是AWT所引发:
       Swing EventListener                                          Method
----------------------------------------------------------------------------------------------------------------
         CaretListener                                        caretUpdate(CaretEvent e)
--------------------------------------------------------------------------------------------------------------
         CellEditorListener                                   editingCanceled(ChangeEvent e)
                                                              editingStopped(ChangeEvent e)
--------------------------------------------------------------------------------------------------------------
         ChangeListener                                       stateChanged(ChangeEvent e)
--------------------------------------------------------------------------------------------------------------
         DocumentListener                                     changedUpdate(DocumentEvent e)
                                                              insertUpdate(DocumentEvent e)
                                                              removeUpdate(DocumentEvent e)
--------------------------------------------------------------------------------------------------------------
         HyperlinkListener                                    hyperlinkUpdate(HyperlinkEvent e)
--------------------------------------------------------------------------------------------------------------
         ListDataListener                                     contentsChanged(ListdataEvent e)
                                                              intervalAdded(ListDataEvent e)
                                                              intervalRemoved(ListDataEvent e)
--------------------------------------------------------------------------------------------------------------
         ListSelectionListener                                valueChanged(ListSelectionEvent e)
--------------------------------------------------------------------------------------------------------------
         MenuDragMouseListener                                menuDragMouseDragged(MenuDragMouseEvent e)
                                                              menuDragMouseEntered(menuDragMouseEvent e)
                                                              menuDragMouseExited(MenuDragMouseEvent e)
                                                              menuDragMouseReleased(MenuDragMouseEvent e)
--------------------------------------------------------------------------------------------------------------
         MenuKeyListener                                      menuKeyPressed(MenuKeyEvent e)
                                                              menuKeyReleased(MenuKeyEvent e)
                                                              menuKeyTyped(MenuKeyEvent e)
--------------------------------------------------------------------------------------------------------------
         MenuListener                                         menuCanceled(MenuEvent e)
                                                              menuDeselected(MenuEvent e)
                                                              menuSelected(MenuEvent e)
--------------------------------------------------------------------------------------------------------------
         PopupMenuListener                                    popupMenuCanceled(PopupMenuEvent e)
                                                              popupMenuWillBecomeInvisible(PopupMenuEvent e)
                                                              popupMenuWillBecomeVisible(PopupMenuEvent e)
--------------------------------------------------------------------------------------------------------------
         TableColumnModelListener                             columnAdded(TableColumnModelEvent e)
                                                              columnMarginChanged(ChangeEvent e)
                                                              columnMoved(TableColumnModelEvent e)
                                                              columnRemoved(TableColumnModelEvent e)
                                                              columnSelectionChanged(ListSelectionEvent e)
--------------------------------------------------------------------------------------------------------------
         TableModelListener                                   tableChanged(TableModelEvent e)
--------------------------------------------------------------------------------------------------------------
         TreeExpansionListener                                treeCollapsed(TreeExpansionEvent event)
                                                              treeExpanded(TreeExpansionEvent event)
---------------------------------------------------------------------------------------------------------------
         TreeModelListener                                    treeNodesChanged(TreeModelEvent e)
                                                              treeNodesInserted(TreeModelEvent e)
                                                              treeNodesRemoved(TreeModelEvent e)
                                                              treeStructureChanged(TreeModelEvent e)
---------------------------------------------------------------------------------------------------------------
         TreeSelectionListener                                valueChanged(TreeSelectionEvent e)
---------------------------------------------------------------------------------------------------------------
         TreeWillExpandListener                               treeWillCollapse(TreeExpansionEvent event)
                                                              treeWillExpand(TreeExpansionEvent event)
---------------------------------------------------------------------------------------------------------------
         UndoableEditListener                                 undoableEditHappened(UndoableEditEvent e)
---------------------------------------------------------------------------------------------------------------
                   





            AWT EventListener                                         Method                      
                 --------------------------------------------------------------------------------------------------------------
          ActionListener                                       actionPerformed(ActionEvent e)
--------------------------------------------------------------------------------------------------------------
          AdjustmentListener                                   adjustmentValueChanged(AdjustmentEvent e)
--------------------------------------------------------------------------------------------------------------
          ComponentListener                                    componentHidden(ComponentEvent e)
                                                               componentMoved(ComponentEvent e)
                                                               componentResized(ComponentEvent e)
                                                               componentShown(ComponentEvent e)
--------------------------------------------------------------------------------------------------------------
          ContainerListener                                    componentAdded(ContainerEvent e)
                                                               componentRemoved(ContainerEvent e)
--------------------------------------------------------------------------------------------------------------
          FocusListener                                        focusGained(FocusEvent e)
                                                               focusLost(FocusEvent e)
--------------------------------------------------------------------------------------------------------------
          ItemListener                                         itemStateChanged(ItemEvent e)
--------------------------------------------------------------------------------------------------------------
          KeyListener                                          keyPressed(KeyEvent e)
                                                               keyReleased(KeyEvent e)
                                                               keyTyped(KeyEvent e)
--------------------------------------------------------------------------------------------------------------
          MouseListener                                        mouseClicked(MouseEvent e)
                                                               mouseEntered(MouseEvent e)
                                                               mouseExited(MouseEvent e)
                                                               mousePressed(MouseEvent e)
                                                               mouseReleased(MouseEvent e)
--------------------------------------------------------------------------------------------------------------
          MouseMotionListener                                  mouseDragged(MouseEvent e)
                                                               mouseMoved(MouseEvent e)
--------------------------------------------------------------------------------------------------------------
          WindowListener                                       windowActivated(WindowEvent e)
                                                               windowClosed(WindowEvent e)
                                                               windowClosing(WindowEvent e)
                                                               windowDeactivated(WindowEvent e)
                            

你可能感兴趣的:(tomcat,C++,应用服务器,MyEclipse,网络应用)