事件机制的总结

本文介绍Java图形界面编程中事件处理的基本原理,包括事件源、事件监听器的概念及其实现方式。通过一个QQ登录界面的例子,详细展示了如何使用ActionListener来响应用户的登录操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当别人打电话过来时,手机铃响。你可以按接听键亦或者不按,这称之为事件;事件源是手机按钮,而不是事件的发生者。因为事件源只能是图形界面组件对象。那如何判断事件源对象呢?答案就是:根据你的动作来确定,动作发生在哪一个组件上,那么该组件就是事件源对象。
另外,比如当我们点击qq图像时会弹出一个登陆界面。要实现这一功能单单创建出qq图形组件是无法实现的,我们要借助事件监听器。它能接受我们的动作,然后作出相应的响应。
事件监听器有如下四种:
1.addActionListener(ActionListener l)-- 动作监听器方法,捕获事件源(输入框)的回车和事件源(按钮)上的鼠标点击。
2.addMouseListener(MouseListener l)-- 鼠标监听器方法,捕获事件源上鼠标按下,释放,单击,进入和离开。
3.addMouseMotionListener(MouseMotionListener l)-- 鼠标移动监听器方法,捕获事件源上鼠标按下拖动或者移动鼠标。
4.addKeyListener(KeyListener l)--键盘监听器方法,捕获事件源上是否有按键按下,松开。
由于事件监听器定义的都是接口,所以我们必须定义一个类来实现相应的接口。如:
public class ButtonListener implements java.awt.event.ActionListener
{
//必须重写接口中的方法
public void actionPerformed(java.awt.event ActionEvent e)
{

}
}
常用的事件处理类有四种: ActionListener、MouseListener、useMotionListener、KeyListener
建立事件监听机制的步骤为:
1.找到事件源jbuLogin
2.给事件源添加动作监听器方法
3.定义一个事件处理类LoginListener,该类要实现ActionListener接口
4.实现事件处理方法。
5.实例化事件处理类的对象
6.给监听器方法添加事件处理类对象


应用于QQ登陆界面实现如下:

package qq;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;

/**
* 定义QQ类,用来实现QQ登陆界面
* @author lenovo
*
*/
public class QQ {
//扩大参数的访问范围,定为全局变量
private JComboBox jcb;
private JPasswordField pwf;
private JFrame jf;

public static void main(String[] args) {
QQ qq=new QQ();
qq.initUl();
}
/**
* 初始化界面的方法
*/
public void initUl()
{
// 实例化一个窗体对象
jf= new JFrame();
//设置窗体属性值
jf.setTitle("海王子的QQ");//设置窗体的标题
jf.setSize(380,290);//设置窗体大小
jf.setResizable(false);//设置窗体不可改变大小
jf.setDefaultCloseOperation(3);//设置窗体关闭时退出程序


//////// ///////////////////////////////////
//调用添加背景图的方法
addBackground(jf);

//获取北边面板的对象
JPanel northPanel=creatNorthPanel();
jf.add(northPanel,BorderLayout.NORTH);

//获取西边面板的对象
JPanel westPanel=creatWestPanel();
jf.add(westPanel,BorderLayout.WEST);//将面板放在窗体西边

//////// ////////////////////////////////////////////
//获取中间面板的对象
JPanel centralPanel=creatCentralPanel();
jf.add(centralPanel,BorderLayout.CENTER);

//////// /////////////////////////////////////////////
//获取南边面板的对象
JPanel southPanel=creatSouthPanel();
jf.add(southPanel,BorderLayout.SOUTH);

//实例化一个事件处理类对象

Loginlistener al = new Loginlistener(jf,jcb,pwf);
//给事件源添加动作监听器方法

jbb.addActionListener(al);


jf.setVisible(true);

}
/*
* 获取北边面板的方法
*/
public JPanel creatNorthPanel()
{
JPanel panel0=new JPanel();//实例化一个面板对象
panel0.setPreferredSize(new Dimension(0,100));//设置面板大小
panel0.setLayout(new FlowLayout(FlowLayout.RIGHT));//设置面板布局方式为右对齐
//把图像放到按钮上
ImageIcon image11=new ImageIcon("image/1.png");
ImageIcon image12=new ImageIcon("image/2.png");
ImageIcon image13=new ImageIcon("image/3.png");
//创建三个按钮对象
JButton jbu1=new JButton(image11);
JButton jbu2=new JButton(image12);
JButton jbu3=new JButton(image13);
//设置按钮大小
jbu1.setPreferredSize(new Dimension(30,18));
jbu2.setPreferredSize(new Dimension(30,18));
jbu3.setPreferredSize(new Dimension(30,18));



//添加按钮到面板上
panel0.add(jbu1);
panel0.add(jbu2);
panel0.add(jbu3);

panel0.setOpaque(false);//设置面板为透明

return panel0;

}
/*
* 获取南边面板的方法
*/
public JPanel creatSouthPanel()
{ JPanel panel2=new JPanel();//实例化一个面板对象
panel2.setLayout(new FlowLayout());//设置面板布局为流式布局

//创建一个按钮
JButton jbb=new JButton("登录");
jbb.setPreferredSize(new Dimension(100,30));

//设置动作命令值
jbb.setActionCommand("Login");


Loginlistener al = new Loginlistener(jf, jcb, pwf);//实例化事件处理类的对象
jbb.addActionListener(al);//给监听器方法添加事件处理类对象。

//添加按钮到面板上
panel2.add(jbb);

panel2.setOpaque(false);//设置面板为透明
return panel2;
}
/*
* 获取中间面板的方法
*/
public JPanel creatCentralPanel()
{
JPanel panel1=new JPanel();//实例化一个面板对象
panel1.setLayout(new FlowLayout(FlowLayout.LEFT));//设置面板布局方式
jcb=new JComboBox();//实例化一个下拉框对象
jcb.setPreferredSize(new Dimension(186,26));//设置下拉框大小
jcb.setEditable(true);//使得下拉框可接受输入
panel1.add(jcb);//将下拉框添加到面板上

JLabel jb1=new JLabel("注册账号");//实例化一个标签对象
jb1.setPreferredSize(new Dimension(72,22));//设置按钮大小
panel1.add(jb1);//将标签添加到面板上

pwf=new JPasswordField();//实例化一个密码输入框对象
pwf.setPreferredSize(new Dimension(187,26));//设置密码输入框大小
panel1.add(pwf);//将密码输入框添加到面板上

JLabel jb2=new JLabel("找回密码");//实例化一个标签对象
jb2.setPreferredSize(new Dimension(72,22));//设置按钮大小
panel1.add(jb2);//将标签添加到面板上

//实例化两个复选框对象
JCheckBox jcb1=new JCheckBox("记住密码");
JCheckBox jcb2=new JCheckBox("自动登录");
//设置复选框大小
jcb1.setPreferredSize(new Dimension(80,16));
jcb2.setPreferredSize(new Dimension(80,16));

//将复选框添加到面板上
panel1.add(jcb1);
panel1.add(jcb2);


panel1.setOpaque(false);//设置面板为透明



return panel1;
}
///////////////////////////////////////////
/*
* 获取西边面板的方法
*/
public JPanel creatWestPanel()
{
JPanel panel=new JPanel();
panel.setPreferredSize(new Dimension(100,0));//设置面板大小
panel.setLayout(new FlowLayout(FlowLayout.RIGHT));//设置面板布局为流式布局靠右显示
//实例化一个ImageIcon对象
ImageIcon image=new ImageIcon("image/123.png");
//实例化一个JLabel对象
JLabel jlaimage=new JLabel(image);
//添加到面板上
panel.add(jlaimage);
//设置面板为透明
panel.setOpaque(false);

return panel;
}
//////////////////////////////////////////////////////
/*
* 添加背景图的方法
*/
public void addBackground(JFrame jf)
{
//实例化一个ImageIcon的对象
ImageIcon image= new ImageIcon("image/8888.jpg");
//实例化一个标签对象
JLabel la=new JLabel(image);
//设置标签的显示时的起始位置与标签大小
la.setBounds(0,0,image.getIconWidth(),image.getIconHeight());
//获取窗体上LayeredPanel面板对象,向该面板对象添加一个标签,同时制定标签显示在该面板的最上层
jf.getLayeredPane().add(la,new Integer(Integer.MIN_VALUE));
//获取LayeredPanel面板上的另一层面板对象ContentPanel
JPanel contentPanel=(JPanel) jf.getContentPane();


//设置面板为透明
contentPanel.setOpaque(false);

}

}

package qq;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
/*
* 定义一个事件处理类Loginlistener
*/
public class Loginlistener implements ActionListener {

//扩大参数的访问范围
private JComboBox jcb;
private JPasswordField pwf;
private JFrame login;

//构造方法,接受下拉框,密码输入框对象
public Loginlistener(JFrame login,JComboBox jcb,JPasswordField pwf){
this.login=login;
this.jcb=jcb;
this.pwf=pwf;
}

/*
* 实现事件处理方法
*
*/
public void actionPerformed(ActionEvent e) {
//获取账号和密码
String usename=(String)jcb.getSelectedItem() +"";
String code = new String(pwf.getPassword());


//判断账号和密码是否相对应
if(usename.equals("海王子")&&code.equals("123"))
{
// 实例化一个窗体对象
JFrame jf= new JFrame();
//设置窗体属性值
jf.setTitle("海王子的QQ");//设置窗体的标题
jf.setSize(380,290);//设置窗体大小
jf.setLocationRelativeTo(null);// 设置窗体显示在屏幕中央
jf.setResizable(false);//设置窗体不可改变大小
jf.setDefaultCloseOperation(3);//设置窗体关闭时退出程序
jf.setVisible(true);//使得窗口可视
}
else
{
//弹出一个消息提示框
JOptionPane.showMessageDialog(login, "你输入账号和密码错误,请重新输入!");
}

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值