一、事件机制
1、事件参与者
事件机制的参与者有三个:事件源,监听器方法(事件类型),事件的处理者。
事件源:事件源是发起动作的对象,java中所有的图形界面组件都可以成为事件源对象。
监听器方法:监听器方法监听某个对象,一旦它发起监听器可识别的动作,监听器方法产生反馈信息。Java中有4种常用的监听器:ActionListener()、 MouseListener()、MouseMotionListener()、KeyListener()。
事件的处理者:最终执行反馈行为的对象,这个类必须实现事件接口。
2、 事件机制流程
事件源发起动作,监听器监听到动作的发生,捕获动作信息及事件源相关信息,然后激活数据处理对象,将收集的动作和信息交给事件处理对象,事件处理对象根据信息执行相应的反馈行为。
3、 实例
现在运用事件机制对简单登录界面进行处理,使之根据输入的账号密码做出相应反应。
先建立一个Login类实现建立一个简单登录界面,代码与之前的一样,只需增加实例化一个事件处理类,并为登录按钮添加监听器。然后建立一个事件处理类,实现监听及反馈效果。具体代码如下:
1、 确定事件源
2、 确定要监听的动作及相应的反馈动作,创建事件处理类实现接口。
3、 实例化事件处理类对象
4、 给事件源添加监听器方法
二、简单画板
在了解怎么给事件源添加监听器之后,就可以试着实现类似系统软件“画图”的简单画板了。例如:按下“Line”按钮就可以画线,按下“Oval”按钮就可以画椭圆。
在开始编写程序前,先总结一下程序中要用到的类。
1、 实现画板需要的API类:JFrame,JPanel,JButton,ImageIcon。
2、 绘制图形需要的类:Graphics,Graphics2D(Graphics的一个子类),Color,JColorchooser。
3、 事件接口类:ActionListener,MouseListener。
下面以画线为例,分析监听器接口的具体实现。
在这里使用MouseListener监听器,MouseListener中有5个抽象方法,分别对鼠标的按下、松开、单击、进入、退出动作进行监控。
我们知道,要画出一条线就得要知道这条线段的起点和终点坐标,在程序中可以用getX()和getY()方法实现。这样就可以在mousePressed()方法中获得按下鼠标时的坐标,在mouseReleased()方法中获得松开鼠标时的坐标,并进行画线操作。
有了坐标以后,要想画线还要有一块画布(Graphics对象),然后就可以通过Graphics对象调用画线的方法了。注意:在声明Graphics对象后,它是没有值的,如果直接运行会报错(空指针异常)。此时,我们需要在定义画板的类中用getGraphics()方法获取画布,接着将画布用构造函数传递给监听器。
以上是用监听器实现画线的单一动作,拓展一下,在窗体上添加几个按钮,一种按钮对应一种操作,还加一个按钮来控制颜色。
要实现这种目的,关键是要获取按钮上的文本,用if语句来判断文本内容,进行相应操作。具体代码如下:
1、事件参与者
事件机制的参与者有三个:事件源,监听器方法(事件类型),事件的处理者。
事件源:事件源是发起动作的对象,java中所有的图形界面组件都可以成为事件源对象。
监听器方法:监听器方法监听某个对象,一旦它发起监听器可识别的动作,监听器方法产生反馈信息。Java中有4种常用的监听器:ActionListener()、 MouseListener()、MouseMotionListener()、KeyListener()。
事件的处理者:最终执行反馈行为的对象,这个类必须实现事件接口。
2、 事件机制流程
事件源发起动作,监听器监听到动作的发生,捕获动作信息及事件源相关信息,然后激活数据处理对象,将收集的动作和信息交给事件处理对象,事件处理对象根据信息执行相应的反馈行为。
3、 实例
现在运用事件机制对简单登录界面进行处理,使之根据输入的账号密码做出相应反应。
先建立一个Login类实现建立一个简单登录界面,代码与之前的一样,只需增加实例化一个事件处理类,并为登录按钮添加监听器。然后建立一个事件处理类,实现监听及反馈效果。具体代码如下:
//Login类在设置窗体可见语句前加上两条语句:
//实例化一个LoginListener事件处理类对象
LoginListener ll = new LoginListener(txtName,pwf);
//给事件源jb实例化一个动作监听器方法,绑定事件处理类
jb.addActionListener(ll);
//事件处理类
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class LoginListener implements ActionListener {
JTextField txt;
JPasswordField pwf;
//定义构造方法,传递txt,pwf的地址
public LoginListener(JTextField txt,JPasswordField pwf){
this.txt = txt;
this.pwf = pwf;
}
// 实现抽象类
public void actionPerformed(ActionEvent e) {
//用两个数组接收账号密码输入框的内容
String str1 = txt.getText();
String str2 = new String(pwf.getPassword());
//判断账号是否输入正确
if(str1.equals("admin")){
//若账号输入正确,判断密码是否正确,正确则打开一个新界面,错误则弹出提示框
if(str2.equals("admin")){
JFrame jf = new JFrame();
jf.setSize(300, 200);
jf.setDefaultCloseOperation(2);
jf.setVisible(true);
}else{
JOptionPane.showMessageDialog(null, "密码输入错误,请重新输入");
}
//账号错误则继续判断密码输入
}else if(str2.equals("admin")){
JOptionPane.showMessageDialog(null, "账号输入错误,请重新输入");
}else{
JOptionPane.showMessageDialog(null, "账号密码输入错误,请重新输入");
}
//System.out.println("你点击了按钮");
}
}
由上可得事件机制一般实现步骤:
1、 确定事件源
2、 确定要监听的动作及相应的反馈动作,创建事件处理类实现接口。
3、 实例化事件处理类对象
4、 给事件源添加监听器方法
二、简单画板
在了解怎么给事件源添加监听器之后,就可以试着实现类似系统软件“画图”的简单画板了。例如:按下“Line”按钮就可以画线,按下“Oval”按钮就可以画椭圆。
在开始编写程序前,先总结一下程序中要用到的类。
1、 实现画板需要的API类:JFrame,JPanel,JButton,ImageIcon。
2、 绘制图形需要的类:Graphics,Graphics2D(Graphics的一个子类),Color,JColorchooser。
3、 事件接口类:ActionListener,MouseListener。
下面以画线为例,分析监听器接口的具体实现。
在这里使用MouseListener监听器,MouseListener中有5个抽象方法,分别对鼠标的按下、松开、单击、进入、退出动作进行监控。
我们知道,要画出一条线就得要知道这条线段的起点和终点坐标,在程序中可以用getX()和getY()方法实现。这样就可以在mousePressed()方法中获得按下鼠标时的坐标,在mouseReleased()方法中获得松开鼠标时的坐标,并进行画线操作。
有了坐标以后,要想画线还要有一块画布(Graphics对象),然后就可以通过Graphics对象调用画线的方法了。注意:在声明Graphics对象后,它是没有值的,如果直接运行会报错(空指针异常)。此时,我们需要在定义画板的类中用getGraphics()方法获取画布,接着将画布用构造函数传递给监听器。
以上是用监听器实现画线的单一动作,拓展一下,在窗体上添加几个按钮,一种按钮对应一种操作,还加一个按钮来控制颜色。
要实现这种目的,关键是要获取按钮上的文本,用if语句来判断文本内容,进行相应操作。具体代码如下:
先定义一个SimpleDraw类,实现画板界面初始化:
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
public class SimpleDraw extends JFrame{
/**
* 程序的入口主函数
*/
public static void main(String[] args) {
//实例化一个SimpleDraw类的对象
SimpleDraw sd = new SimpleDraw();
//调用初始化窗口
sd.initUI();
}
/**
* 定义实现简单面板窗口方法
*/
public void initUI(){
this.setTitle("简单画板");
this.setSize(500,500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
//设置流体布局
this.setLayout(new FlowLayout());
//实例化按钮
JButton jbLine = new JButton("Line");
JButton jbRect = new JButton("Rect");
JButton jbOval = new JButton("Oval");
JButton jbColor = new JButton("Color");
//添加按钮
this.add(jbLine);
this.add(jbRect);
this.add(jbOval);
this.add(jbColor);
//为按钮添加动作监听器,改变图形颜色
ActListener al = new ActListener();
jbLine.addActionListener(al);
jbRect.addActionListener(al);
jbOval.addActionListener(al);
jbColor.addActionListener(al);
//设置窗体可见
this.setVisible(true);
//获取事件源上的Graphics对象
Graphics g = this.getGraphics();
//实例化一个DrawListener事件处理类,传递g的值
DrawListener dl = new DrawListener(g);
//给事件源添加鼠标监听器方法,绑定事件处理类对象
this.addMouseListener(dl);
}
}
接下来创建鼠标监听器:
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class DrawListener implements MouseListener{
//定义接收坐标点的参数
int x1,y1,x2,y2;
private Graphics g;
//定义构造方法,传递g的值
public DrawListener(Graphics g){
this.g = g;
}
//按下鼠标时实现的动作
public void mousePressed(MouseEvent e) {
//获得鼠标按下时的坐标
x1 = e.getX();
y1 = e.getY();
}
public void mouseReleased(MouseEvent e) {
//获得鼠标释放时的坐标
x2 = e.getX();
y2 = e.getY();
//设置颜色改变
g.setColor(ActListener.color);
//输出点击的按钮上的文字
System.out.println("str = " +ActListener. str);
//判断按钮上的文字,根据文字的不同执行不同操作
if(ActListener.str.equals("Line")){
System.out.println("画一条直线");
//画一条直线
g.drawLine(x1, y1, x2, y2);
}else if(ActListener.str.equals("Rect")){
System.out.println("画一个矩形");
//画一个矩形
g.drawRect(x1, y1, Math.abs(x2-x1),Math.abs(y2-y1));
}else if(ActListener.str.equals("Oval")){
System.out.println("画一个椭圆");
//画一个椭圆
g.drawOval(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
}
}
public void mouseEntered(MouseEvent e) {
System.out.println("进入");
}
public void mouseExited(MouseEvent e) {
System.out.println("退出");
}
public void mouseClicked(MouseEvent e) {
System.out.println("单击");
}
}
定义动作监听器:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JColorChooser;
public class ActListener implements ActionListener{
public static Color color;
public static String str;
public void actionPerformed(ActionEvent e) {
//判断按钮是否为Color
if(e.getActionCommand().equals("Color")){
//若是,则弹出颜色设置界面,并设置颜色
//不指定父窗体,弹出窗口名称,默认颜色
color = JColorChooser.showDialog(null, "颜色界面", Color.BLACK);
System.out.println("Color="+color);
}else{
//不是,则获得按钮文本并输出,方便之后的判断
str = e.getActionCommand();
System.out.println("str="+str);
}
}
}