`
lazyee
  • 浏览: 15128 次
社区版块
存档分类
最新评论

事件机制与简单画板

    博客分类:
  • java
阅读更多
一、事件机制
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);
		}
	}

}
分享到:
评论

相关推荐

    易语言画板应用事件

    易语言画板应用事件源码,画板应用事件,显示亿万位,画板统计数据

    用qt 编写简易画板

    这是我初学qt编写的简易画板程序,程序结构和算法不算优秀,请多多指教

    易语言简易画板

    易语言简易画板源码,简易画板,公用接口_寻找文件扩展,公用接口_复制目录,公用接口_数组到表格,公用接口_生成编号,公用接口_生成密码,公用接口_时间到文本,公用接口_数据到十六进制文本,公用接口_十六进制文本到数据,...

    MFC简易画板

    用VC开发工具编写的MFC简易画板,可以实现类似与windows自带画板的一些功能

    Android简易画板源码

    使用Android的自定义View写的Android画板程序,主要使用DrawPath()实现,需要的童鞋可以下来看看。

    web点击按钮事件弹出画板功能的画板插件

    web点击按钮事件弹出画板功能的画板插件,windows自带的画板工具,在做视频教学的项目中需要用到画图工具,这个插件功能还是非常完善的

    简易画板.py

    使用python做的一个简易画板,能够实现画点、画直线、画多边形、画椭圆等功能,其中包含了对Tkinter的操作以及对于GUI的操作,希望对python初学者能够有所帮助

    C# 2010 简易画板

    提供源代码 直接可运行 提供了比较全面的画板功能

    一个简易画板的实现 VS2010 QT4.8做的 C++

    一个简易画板的实现 有简单的画图,画图形,改颜色功能

    VC++课程设计_windows简单画板

    VC++课程设计,windows简单画板,可以画直线、矩形、椭圆、改颜色、线条;清除,保存打开功能。

    QT做的简易画板

    用qt做的简易画板,能够实现图形,颜色,线宽选择。用鼠标移动操作。

    c#简单画板程序

    c#简单画板程序 有c#代码编写的简单画板程序 代码类资源

    java画板 比较简单的画板

    java画板 比较简单的画板 ,初学者可以借鉴下!java画板 比较简单的画板 ,初学者可以借鉴下!java画板 比较简单的画板 ,初学者可以借鉴下!

    qt之简易画板

    本程序为简易画板程序,主要解决画板的一些基本问题,并保持绘画的流畅。希望对新人有所帮助

    画板画板画板画板画板画板画板

    画板

    C#简易画板

    这是用C# GDI实现的简易画板Demo,对应博文http://blog.csdn.net/luols/article/details/7171668,有需要的朋友可以下载样例试用

    matlab简易画板GUI程序

    matlab简易画板GUI程序 可选择点、线、矩形、椭圆进行画图 可以选择颜色、线条粗细 有橡皮擦、清除按钮 只有添加文本框的功能还没有实现~

    java简易小画板

    本代码是编写的一个java简易小画板 计算机图形学

    画板简单版画板简单版画板简单版

    画板简单版画板简单版

    简单画板(源代码)

    简单画板(源代码)有有橡皮筋功能,文本输入功能,文件输入保存功能,调色功能,取色功能等等 用MFC实现

Global site tag (gtag.js) - Google Analytics