3
事件处理机制
什么是事件?
对对象所做的一-组动作称为事件。
在GUI程序运行中,通过鼠标、键盘与GUI界面直接或间接交星都会生成事件。如: 按下一一个按钮、通过键盘输入一一个字符、选择列表框中的一项、点击- - 下鼠标等。。当事件发生后,系统会通知我们去处理这些事件。对这些事件做出相应处理的程序,称为事件处理器。
事件处理机制中,涉及到三个对象:事件本身、事件的来源和事件处理器
事件
事件是事件类的一一个对象,事件类的根类是java. util. EventObject。通常所用到的事件类在java. awt. event包中。
事件对象的属性包含了与事件相关信息。。如可以使用Event0b ject类中的ge tSource ()方法获得事件源。
事件源
事件源是产生事件的对象。
一个事件源可能会产生不同类型的事件。
事件监听器
事件监听器是在一个事件发生时被通知的对象,也称为事件处理器。
监听器对象属于一一个监听器类的实例,这个类实现了一个特殊的接口,称为“监听者接口。”
注册事件
事件源提供了一组方法,用于为事件注册一个或多个监听器对象,并向其发送事件对象。
每种不同的事件都有其自己的注册方法。一般形式为:
public voidladdListener (TypeListener e)
总结处理事件的具体方法
确认触发的事件,取得事件类(如ActionEvent)的名字,并删掉其中的“Event”字样,加上
“Listener"字样。这就是我们类需要实现的事件监听类接口。
实现上面的接口,针对想要捕获的事件编写方法代码。如想要捕获鼠标的移动,就要为
MouseMotionListener接口中的mouseMoved()方法编写代码( 当然还要实现其他- - -些方法)。
事件处理流程
第一种方法
package com.imua.gui;
import javax.swing.*;
import java.awt.*;
public class Login extends JFrame implement ActionListtener{
private JLabel lname;
private JLabel lpass;
private JTextField tname;
private JTextField tpass;
//隐藏密码 privateJPasswordField tpass;
private JButton login;
Private void initEvent(){
Login.addActionListtener(this);
}
private void init() {
lname=new JLabel("用户名");
lpass=new JLabel("密 码");
tname=new JTextField(14);
tpass=new JPasswordField(14);
login=new JButton("登录");
this.setLayout(new FlowLayout(FlowLayout.CENTER));
this.add(lname);
this.add(tname);
this.add(lpass);
this.add(tpass);
this.add(login);
//1.获取屏幕大小
//2.设置为大小
Dimension dim=getToolkit().getScreenSize();
int w=dim.width/2;
int h=dim.height/2;
this.setResizable(false);
this.setTitle("QQ登录");
this.setSize(255, 125);
this.setLocation(w-255/4, h-125/4);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public Login() {
init();
}
//处理器方法
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(“单击了按钮...”+tname.getText()+”,”+tpass.etText()”,”+e.getSource());
//返回private JButton login;
}
}
第二种形式
package com.imua.gui;
import javax.swing.*;
import java.awt.*;
public class Login extends JFrame{
private JLabel lname;
private JLabel lpass;
private JTextField tname;
private JTextField tpass;
//隐藏密码 privateJPasswordField tpass;
private JButton login;
Private void initEvent(){
Login.addActionListtener( new ActionListtener());{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(“单击了按钮...”+tname.getText()+”,”+tpass.etText()”,”+e.getSource());
}
}
}
private void init() {
lname=new JLabel("用户名");
lpass=new JLabel("密 码");
tname=new JTextField(14);
tpass=new JPasswordField(14);
login=new JButton("登录");
this.setLayout(new FlowLayout(FlowLayout.CENTER));
this.add(lname);
this.add(tname);
this.add(lpass);
this.add(tpass);
this.add(login);
//1.获取屏幕大小
//2.设置为大小
Dimension dim=getToolkit().getScreenSize();
int w=dim.width/2;
int h=dim.height/2;
this.setResizable(false);
this.setTitle("QQ登录");
this.setSize(255, 125);
this.setLocation(w-255/4, h-125/4);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public Login() {
init();
}
}
第三种形式(最常用)
package com.imua.gui;
import javax.swing.*;
import java.awt.*;
public class Login extends JFrame {
private JLabel lname;
private JLabel lpass;
private JTextField tname;
private JTextField tpass;
//隐藏密码 private JPasswordField tpass;
private JButton login;
Private void initEvent(){
Login.addActionListtener( new MyListener() );{
}
}
private void init() {
lname=new JLabel("用户名");
lpass=new JLabel("密 码");
tname=new JTextField(14);
tpass=new JPasswordField(14);
login=new JButton("登录");
this.setLayout(new FlowLayout(FlowLayout.CENTER));
this.add(lname);
this.add(tname);
this.add(lpass);
this.add(tpass);
this.add(login);
//1.获取屏幕大小
//2.设置为大小
Dimension dim=getToolkit().getScreenSize();
int w=dim.width/2;
int h=dim.height/2;
this.setResizable(false);
this.setTitle("QQ登录");
this.setSize(255, 125);
this.setLocation(w-255/4, h-125/4);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public Login() {
init();
}
Class MyListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(“单击了按钮...”+tname.getText()+”,”+tpass.etText()”,”+e.getSource());
}
}
}
焦点事件
任何GUI对象的获得或失去焦点都被视为焦点事件,并且事件源必须向事件监听器通知事件对象已失去或已获得焦点。
焦点监听器需要实现两个方法:focusGained和focusLost.
要进行错误检查或数据校验时,对焦点的捕捉就显得尤其重要。
package ccm. imau. gui ;
Import java.awt. *;
import javax. swing. *;
import java. awt .event.*;
public class EvtentDemo extends JFrame {
Private JTextField tf;
Private viod initEvent(){
Tf.addFoucusListener( new MyListener());
}
Public EvtentDemo(){
Init();
}
private void init() {
Tf=new JTextField (10);
This.add(tf);
this.setLayout(new FlowLayout(FlowLayout.CENTER));
initEvent();
//1.获取屏幕大小
//2.设置为大小
Dimension dim=getToolkit().getScreenSize();
int w=dim.width/2;
int h=dim.height/2;
this.setResizable(false);
this.setTitle("事件案例");
this.setSize(500,300);
this.setLocation(w-500/4, h-300/4);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Class MyListener implements FouceListener{
@Override
public void focusGained //获取焦点(FocusEvent e) {
}
@Override
public void focusLost //失去焦点 (FocusEvent e) {
//getComponent() 获取当前组件对象
//requestFocus() 从新获取焦点
1.System.out.println(“bb”+e.getComponent()==tf);
2.System.out.println(“bb”)
Tf.requestFocus();
If (tf.getText().lengtf()<=8)
System.out.println(“密码必须大于8位”);
if.requestFocus();
}
}
窗口事件
当一个窗口被**、禁止、关闭、正在关闭、最小化、恢复、打开时将生成窗口事件。
需要实现的方法如下:
windowActivated、, windowClosed
windowClosing、windowDeact ivated
windowDeiconified、windowIconified
indowOpened
上一篇: 3