事件机制与简单画板

一、事件机制
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);
}
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值