#java使用AWT和Swing包两套组件实现图形化用户界面。
#图形化用户界面(GUI,Graphics User Interface)
#java提供的图形化用户界面组件全都在java.awt包中。
#AWT提供的图形功能是各种通用操作系统所提供功能的交集,由于是依靠本地方法来实现其功能的,因此通常把AWT控件称为重量级控件。
Swing是在AWT基础上构建的一套新的组件,提供了AWT的所有功能,并对AWT进行了扩充,是AWT的改良版。Swing中没有使用本地方法来实现图形功能,因此称为轻量级控件。
#AWT和Swing之间的基本区别:从直接命名来看,Swing组件通常有大写字母J开头,从运行效率来看,由于AWT是基于本地方法的C/C++程序(Swing是基于AWT的java代码),其运行速度较快。从适用对象来看,简单高效的AWT适于嵌入式java(硬件资源有限),pc或工作站的标准java应用中(硬件资源较多,需求较高)用Swing。
#

Swing组件都是AWT的Container类的直接子类或间接子类。与AWT相比,Swing提供了更完整的组件,引入了许多新的特性和功能。SwingAPI是围绕着实现AWT各个部分API构建的,这保证了所有早期的AWT组件仍然可以使用。在javax.swing包中,定义了两种类型的组件,顶层容器(JFrame,JApplet,JDialog和JWindow)和轻量级组件。顶层容器仍属于重量级控件,而其他的轻量级组件都是围绕一个JComponet组件构建的。JComponent则由AWT的Container类扩展而来。
#Swing组件:

如图所示,Swing组件从API类使用上可分为三大类
①容器类,包含其他组件的容器,包括顶层容器(JFrame,JApplet等)和一般容器(JPanel等)。容器是一种特殊的组件,可以包含其他组件。新类继承容器类,用Container obj=getContentPane()获取容器,obj.add(组件)将组件添加到容器中,obj.setLayout()设置布局。
②控件类,都是JComponent类(抽象类)的子类,多数能相应事件,如JButton,JTextField,JTextArea,JComboBox,
3,辅助类,描述和绘制容器类和组件类的属性和位置,如图形环境,颜色,字体,大小,摆放位置,例如:Graphics,Color,Font,FontMetrics等
注:所有的Swing组件都实现了Accessible接口,提供对可存取性的支持,使得辅助功能如(屏幕阅读器)能够十分方便地从Swing组件中得到信息。在Swing组件中,使用JComponent类的registerKeyboardAction()方法,能使用户通过键盘操作代替鼠标驱动GUI上的Swing组件的相应动作。有些类还为键盘操作提供了更便利的方法,其实相当于热键,使得用户可以只通过键盘进行操作;对Swing组件可以设置一个或多个边框。一种空白边框可以增大组件,同时协助布局管理器对容器中的组件进行合理的布局;与AWT的组件不同,许多Swing组件如按钮,标签等,除了使用文字外,还可以使用图标作为装饰。
#JFrame类 窗体组件;JLabel类,标签组件,用于显示文本,图像,或同时显示两者,JButton类,按钮组件,可出发特定动作,JTextField类,单行文本框组件,JTextArea类,多行文本框组件,
#java事件处理机制。
事件处理是指java应用能够对某些事件做出响应。事件表达了系统,应用程序及用户之间的动作和响应。图形用户界面利用事件机制实现用户与程序的交互。产生事件的组件称为事件源。如当用户单击某个按钮时就会产生动作事件,该按钮就是一个事件源。要处理产生的事件,需要在特定的方法中编写处理事件的程序。这样,当产生某种事件时就会调用处理这种事件的方法,从而实现用户和程序的交互,这就是图形用户界面事件处理的基本原理。
java中,每种事件都属于一个事件类,具体的事件则是事件的实例;程序通过事件监听器对象,捕获到用户激发的消息,并执行相关的事件处理方法。
java程序运行过程中,可能发生的事件种类繁多,选择相应事件的过程,称为注册。所谓注册就是某对象向事件源提出申请,表明自己对某类事件感兴趣,希望该事件发生时得到通知。提出申请的对象称为监听器。监听器只接收注册事件。
eg 为确定按钮注册action事件的监听器
JButton confirmButton=new JButton("确定");
confirmButton.addActionListener(handler);
//handler为监听器类对象,监听器类需自己定义,实现ActionListener接口(监听器接口),
//实现actionPerformed(ActionEvent event)方法,event是ActionEvent事件对象,
//即单击事件对象,
//button是事件源,handler是事件监听器对象
当按钮被按下时(action事件发生),监听器执行某种操作,称为对事件响应。
并非任何类都是监听器类,java对监听器的行为特征有一定要求,这些要求的具体表现就是监听器接口。监听器接口规定了该监听器应该实现的功能,只有实现了监听器接口的类才是监听器类。
一个事件可以由多个事件源产生,而注册在该事件类上的监听器也可以不只一个,因此,事件源,事件和监听器之间具有多对多的关系。这种多对多的关系,构成了对象之间相互沟通的网路,使得对象既可以协同一致,又可以保持各自的相对独立。这正是事件驱动模式的精髓所在。
要想使GUI接收用户的操作,就必须给各个组件加上事件的监听机制。在事件处理过程中,主要涉及三类对象:
①事件对象(Event Object):用于监听器(Listener)方法中的参数,如actionPerform方法。由KeyEvent,ActionEvent事件。
②事件源(Event Source):例如单击一个按钮,这个按钮就是事件源,要使该按钮对某些事件进行响应,就需要为按钮注册特定的监听器(addxxxListener)
3,事件监听器(Event Listener):或称作事件处理者(Event Handler)。当它监听到事件对象产生时,就调用相应方法。
java Swing中处理各种组件事件的一般过程:首先为要响应事件的组件(事件源)注册事件监听器,当组件监听到外部作用时,生成事件对象,传入事件监听器,调用相应处理方法。
#编写事件处理程序包括以下三个步骤;
一,定义监听器类,在类的定义中完成事件的处理(实现actionPerform())方法。
二,通过new创建事件监听器类对象。
三,为组件注册相应的事件监听器对象addxxxListener();
采用两种方法实现上述三个步骤,第一是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件;第二是使用多个内部类来响应不同组件产生的各自事件,其具体实现又分为两种形式,一个是匿名内部类,一个是一般内部类。
①直接实现监听器类方式
public class ButtonAct extends JFrame implements ActionListener{ //第一步
private JButton b1;
.....
public ButtonAct(){
.....
b1.addActionListener(this);;
add(b1); //第二步,第三步
.....
}
public void actionPerformed(ActionEvent e){
who.setText("Button 1"); //定义处理方法
}
.....
}
程序说明:第一步为定义监听器类,第一行代码将主类ButtonAct声明为实现动作接口ActionListener的监听器类,在主类内部第十行代码开始利用actionPerform()方法完成事件处理。第二步为创建监听器对象。第三步为注册事件监听器。第6行代码为按钮1注册监听器,监听器对象即为ButtonAct类的对象this。
②内部类方式
方式一(一般内部类):
public class ButtonAct extends JFrame{
private JButton b1;
.....
public ButtonAct(){
.....
b1.addActionListener(new B1());
add(b1);
.....
}
class B1 implements ActionListener{
public void actionPerformed(ActionEvent e){
who.setText("Button 1");
}
}
.....
}
还可以:
public class ButtonAct extends JFrame{
private JButton b1;
.....
public ButtonAct(){
.....
b1.addActionListener(handler);
add(b1);
.....
}
private B1 handler=new B1();
class B1 implements ActionListener{
public void actionPerformde(ActionEvent e){
......
}
}
.....
}
方式二(匿名内部类):
public class ButtonAct extends JFrame{
private JButton b1;
.....
public ButtonAct(){
.....
b1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){...}
}
);
add(b1);
......
}
}
还可以:
public class ButtonAct extends JFrame{
private JButton b1;
.....
public ButtonAct(){
.....
b1.addActionListener(hander);
add(b1);
.....
}
private ActionListener handler=new ActionListener(){
public void actionPerformed(ActionEvent e){
.....
}
}
.....
}
#事件类与事件监听接口
java.until.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。AWT的相关事件继承与java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件。低级事件是指基于组件和容器的事件,当一个组件发生事件如:鼠标的进入,单击,释放等,或组件的窗口开关等,便触发了组件事件。高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类,如在JTextArea中按Enter键会触发ActionEvent事件,滑动滚条会触发AdjustmentEvent事件,或是选中项目列表的某一条就会触发ItemEvent事件。

在图中AWTEvent的低级事件包括:
组件事件(ComponentEven),控制组件尺寸的变化和移动;
容器事件(ContainerEvent),控制组件增加减少与移动;
窗口事件(WidowEvent),控制窗口关闭,还原,窗口最小化
焦点事件(FocusEvent),负责焦点的获得和丢失,
鼠标事件(MouseEvent),负责捕捉鼠标的单击与移动
高级事件包括:
动作事件(ActionEvent)激活组件,如单击按钮,在文本框中按Enter等
调节事件(AdjustmentEvent),在滚动条上移动滑块以调节数值;
项目事件(ItemEvent),选择项目;
文本事件(TextEvent),文本对象改变。
下表是常用事件及监听器接口:

#事件适配器
对定义的事件监听器接口,他可能包含多个事件处理方法,但在使用是往往只需要一个,此时就可以使用事件适配器将事件监听接口抽象化,事件适配器给出每一个接口方法的默认实现,这样在需要使用某方法时,只需要重写所需方法即可。
下面是事件监听器接口与事件适配器对照表:

以MouseAdapter(鼠标适配器为例):
public abstract class MouseAdapter extends Object
implements MouseListener,MouseWheelListener,MouseMotionListener{
mouseClicked(){};
......
mouseWheelMoved(){};
}
因为MouseListener和MouseMotionListener里面有很多方法,不一定都需要,所以引入MouseAdapter这个抽象类,默认实现两个接口,需要监听器对象时,new一个Adapter对象,实现需要的方法即可。
采用适配器设计模式可以只关注感兴趣的事件,其他事件交由适配器的空方法进行默认处理。