------- android培训、java培训、期待与您交流! ----------
事件监听机制
事件监听机制的组成是由4部分组成,分别是:事件源、事件对象、监听器、外部动作。由监听器监听事件源情况,当发生对应外部动作时,事件源产生相应的事件对象反馈信息,并由监听器捕获产生需要的处理。
每一个事件源都有自己特有的对应事件和共性事件。特性事件就是只能由本事件源触发的,共性事件则是所有或者多个事件可以触发的。当事件发生的时候,产生的事件对象会将发生事件的事件源和与事件相关的信息封装到一个对象当中发给监听器。对应事件的处理方式,都是封装到监听器中的。
整个过程其实是固定的,而如何实现对事件的处理,才是编程中需要考虑的部分。注意分清事件源。且在添加事件处理前,需先importjava.awt.event.*。
想要实现事件对象的处理,我们就必须知道事件源,同时还得知道事件对象所对应的监听器类型。通常的监听器一般都是以xxxListener或者xxxAdapter这种格式出现。对于xxxAdapter适配器形式的,一般都是该事件的事件源有超过3个的对象需要处理时,才会封装的。较xxxListener单纯的接口形式来说,xxxAdapter覆盖了他所实现的原接口类中的方法,并实现了它们的基本功能。这样做是为了在程序只需要部分重写处理方法的时候,不需要覆盖全部处理方法。可以将xxxAdapter看作是原有xxxListener的升级版,比如windowListener和windowAdapter。
对于一些共性事件是需要我们熟记的,例如鼠标事件、键盘事件。
鼠标事件MouseListene
鼠标事件MouseListener,他所处理的是鼠标相关的操作:
mouseClicked(MouseEvent e ):用于处理鼠标在组件上单击时的动作;
mouseEntered(MouseEvent e ):用于执行鼠标进入对应组件所在区域时的操作;
mouseEcited(MouseEvent e ):用于执行鼠标离开对应组件所在区域时的操作;
mousePressed(MouseEvent e ):用于处理鼠标在组件上按下时的操作;
mouseReleased(MouseEvent e ):用于处理鼠标在组件上释放时的操作;
注意,单击是一个按下再释放的过程,即clidk是不同于press和realse的。当涉及到鼠标具体的操作类型时,我们通常查阅MouseEvent事件类来利用里面的方法实现,如:实现双击时所调用的getClickCount( )方法。由于鼠标事件处理方法超过三个,因此,它具有适配器MouseAdapter。
键盘事件KeyListener
键盘事件KeyListener,他所处理的是键盘上的相关操作:
keyPressed( KeyEvent e):按下某个按键时,调用此方法处理;
keyReleased( KeyEvente ):释放某个按键时,调用此方法处理;
keyTyped( KeyEvent e ):键入某个按键时,调用此方法;
同样的,type键入是某个按键按下和释放这两个过程的集合。因此,对应的type过程,可以拆分为press和release这两个过程来分别处理。对应的常用KeyEvent方法有getKeyChar( )、getKeyCode()、getKeyText( )、consume(),而对于一些键盘组合键如Crtl+F,我们就可以用
e.isControlDown( )&& e.getKeyCode( ) ==KeyEvent.VR_F
这种组合形式来判断组合按键。
特性事件
而对于一些特性事件,我们一般使用自定义类继承ActionListener,并覆盖其中的actionPerformed(ActionEvent e )方法来实现特有事件激活所对应操作。
综合例题
上面,我们了解了基本的事件响应机制的使用方法。由于GUI和事件响应机制是和IO操作等一系列基础操作紧密联系在一起的。而且,较之以往本部分内容是比较散,且关联逻辑性不太紧密,更偏向于应用方面。因此,本人在这里用一道综合性例题来说明,GUI和事件响应机制,在程序中的作用,及它们自身的使用方式。这也是一次对前文总结知识的综合应用。看例题:
/**@author:LZ(埠箬)
*/
/*目标:构建一个小应用程序,能够在PC上实现文本文件的简易编写操作
分析需求:
1.读取文件,已存在文件,阅读、修改。
2.保存文件,已存在文件或未存在文件,未存在则新建文件。
3.用户需求一个建议的GUI,来满足简便操作。
思路:
1.设计GUI
2.设计需要使用的工具方法
3.设计消息响应
4.设计读写流操作
总结:
1.本程序其实可以分为多个类,来便于查询。当然,由于是小程
序,放一起也不影响
2.本例的主要目的是为了展示包括字符流,消息响应机制,GUI
简易设计在内的多章节综合应用,是对本总结前文的一次综合
应用
3.本程序并非非常完善,其中对于IO异常的处理,就直接抛给了
jvm,这是为了节省篇幅。实际编写中这样是不可行的,或者说
尽量避免这种情况发生。
*/
import java.awt.*;
importjava.awt.event.*;
import java.io.*;
class S2ADemo
{
/*程序声明*/
/*==============================================================*/
//程序主体框架声明
private Frame f ;
private Button b ;
private TextField tf ;
private TextArea ta ;
//菜单声明
private MenuBar mb ;
private Menu m ;
private MenuItem ms ;
private MenuItem ml ;
private MenuItem me ;
//存储、读取对话框声明
private FileDialog save ;
private FileDialog load ;
//退出程序对话框声明
private Label exLab ;
private Button exButY ;
private Button exButN ;
private Dialog exit;
//文件记录器声明
private File file = null;
/*程序主体部分*/
/*==============================================================*/
public static void main(String[] args)
{
}
//框架及程序初始化配置函数
private static void init()
{
//初始化程序主体
f = new Frame();
b = newButton("Confirm");
tf = new TextField("请在这里输入访问地址");
ta = new TextArea();
//初始化菜单
mb = new MenuBar();
m = new Menu("菜单");
ms = new MenuItem("保存");
ml = new MenuItem("读取");
me = new MenuItem("退出");
//初始化对话框
initSave();
initLoad();
initExit();
//初始化文件记录器
file = null;
//程序设定
f.setBounds(400,400,600,500);
f.setLayout(new BorderLayout());
m.add(ms);
m.add(ml);
m.add(me);
mb.add(m);
f.setMenuBar(mb);
f.add(tf,BorderLayout.NORTH);
f.add(b,BorderLayout.NORTH);
f.add(ta,BorderLayout.CENTER);
myEvent();
f.setVisible(true);
}
/*对话框*/
/*==============================================================*/
//保存文件对话框初始化方法
private static void initSave()
{
save = new FileDialog(f,"保存文件",FileDialog.SAVE);
}
//读取文件对话框初始化方法
private static void initLoad()
{
load = new FileDialog(f,"读取文件",FileDialog.LOAD);
}
//退出判断对话框初始化方法
private static void initExit()
{
exLab = new Label("是否退出?");
exButY = newButton("Yes");
exButN = newButton("No");
exit = new Dialog(f,"退出窗口",Dialog.DEFAULT);
exit.setBounds(600,600,400,300);
exit.setLayout(newBorderLayout());
exit.add(exLab,BorderLayout.CENTER);
exit.add(exButY,BorderLayout.SOUTH);
exit.add(exButN,BorderLayout.SOUTH);
}
//保存文件算法
private static void mySave()
{
save.setVisible(true);
if(!file.exists())
{
String dir =save.getDirectory();
String sf = save.getFile();
if(dir==null || lf==null)
return;
file = new File(dir,sf);
}
write();
}
//读取文件算法
private static void myLoad()
{
load.setVisible(true);
String dir = load.getDirectory();
String lf = load.getFile();
if(dir==null || lf==null)
return;
file = new File(dir,lf);
read();
}
/*事件处理*/
/*==============================================================*/
//本程序事件处理响应方法
private static void myEvent()
{
menuEvent();
}
//菜单事件响应处理
private static void menuEvent()
{
ms.addActionListener(newActionListener()
{
public voidactionPerformed(ActionEvent e)
{
mySave();
}
});
ml.addActionListener(newActionListener()
{
public voidactionPerformed(ActionEvent e)
{
myLoad();
}
});
me.addActionListener(newActionListener()
{
public voidactionPerformed(ActionEvent e)
{
myExit();
}
});
}
//退出对话框内部事件处理
private static void myExit()
{
exButY.addActionListener(new ActionListener()
{
public voidactionPerformed(ActionEvent e)
{
System.exit(0);
}
});
exButN.addActionListener(newActionListener()
{
public voidactionPerformed(ActionEvent e)
{
exit.setVisible(false);
}
});
exit.addWindowListener(newWindowAdapter()
{
public voidwindowClosing(WindowEvent e)
{
exit.setVisible(false);
}
});
}
//主体窗口事件响应处理
private static void myWindow()
{
f.addWindowListener(newWindowAdapter()
{
public void windowClosing(WindowEvente)
{
myExit();
}
});
}
//TextFeild文本框及配套按钮事件响应处理
private static void myTextField()
{
tf.addKeyListener(new KeyAdapter()
{
public voidkeyPressed(KeyEvent e)
{
if(e.getKeyCode() ==KeyEvent.VK_ENTER)
{
getTF();
}
}
});
b.addActionListener(newActionListener()
{
public voidactionPerformed(ActionEvent e)
{
getTF();
}
});
b.addMouseListener(newMouseAdapter()
{
public voidmouseClicked(MouseEvent e)
{
getTF();
}
});
}
/*程序涉及工具方法*/
/*==============================================================*/
//文本框处理算法
private static void getTF()
{
String buf = tf.getText();
file = new File(buf);
if(!file.exists())
{
tf.setText("文件不存在!!请重输");
return;
}
read();
}
//文档读取
private static void read()
{
try
{
BufferedReader br = newBufferedReader(new Reader(file));
String content = null;
while((content=br.readLine())!=null)
{
ta.append(content+"\r\n");
}
}
catch (IOException ee)
{
throwRuntimeException("new_Reader_ERROR");
}
finally
{
if(br!=null)
{
try
{
br.close();
}
catch (IOExceptionee)
{
throwRuntimeException("close_Reader_ERROR");
}
}
}
}
/* 当然,文档读取也可以用下面这种方法。为简略,省略了异常处理
正常使用时,必须添加异常处理部分
BufferedReader br = newBufferedReader(new Reader(file));
String content;
while((content=br.readLine())!=null)
{
//这里也可以使用TextArea的append方法
StringBuilder buf = newStringBuilder();
buf.append(content+"\r\n");
}
ta.setText(buf.toString());
br.close();
*/
//文档存储
private static void write()
{
try
{
BufferedWriter bw = newBufferedWriter(new Writer(file));
String content =ta.getText();
bw.write(content);
}
catch (IOException ee)
{
throwRuntimeException("new_Writer_ERROR");
}
finally
{
if(bw!=null)
{
try
{
bw.close();
}
catch (IOExceptionee)
{
throwRuntimeException("close_Writer_ERROR");
}
}
}
}
//文件记录器,记录情况判断方法
private boolean isFileExist()
{
}
}
------- android培训、java培训、期待与您交流! ----------