事件机制
  假设我们要编写一个
画图板软件,想想我们画图板上需要哪些东西,首先肯定要有一个窗体,之后肯定要有几个面板,还要有按钮,或许还要有标签,有了这些组件之后我们还要让这些组件来实现我们的功能,比如点直线按钮,就可以画直线,点正方形按钮就可以画出正方形,如何才能实现这些功能呢,这就要说到事件机制了。
  1.事件的概念:
事件处理时界面处理的基本功能。当我们点下鼠标时,
Swing界面上获得的焦点组件都会收到一个事件通知,这是Swing系统内部发出的,界面就会根据收到的事件通知做出相应的处理。
  2.事件处理流程:一般由三部分组成;事件源,事件对象,事件处理过程
  事件源:所有的图形界面组件对象都可以成为事件源对象。
	如何确定某一个组件是事件源对象?
		动作发生在哪一个组件上,那么该组件就是一个事件源对象。
  事件对象:按键事件还是鼠标单击事件
  事件处理过程:再Swing中处理事件,系统已经为我们提供了常见的事件通知
接口,我们要做的只是实现相应的事件接口。
  以ActionListener为例,这是一个所有组件都有的一个接口。看下面一段代码:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public 
class ActionListener_example implements ActionListener {
	
	public void actionPerformed(ActionEvent e) {
		
		System.out.println("~~~~~");
	}
}
  我们只要编写一个类来实现ActionListener其中的方法就行。这个方法只有一个ActionEvent(事件对象)类型的参数;这个ActionEvent对象有许多方法可以得到事件源的相关信息,ActionEvent对象的getSource()返回一个Object类型的对象,指向了发生这个事件的事件源,比如点击了一个JButton,就可以将这个Object强制转型为JButton类型,就可以得到事件源对象。GetActionCommand()方法可以得到事件源上的标签作为一个String类型,比如一个菜单就可以得到菜单标题。看下面一段代码:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class MyButton implements ActionListener {
	MyButton mb=new MyButton();
	public void actionPerformed(ActionEvent e) {
		Object sour =e.getSource();
		if(sour 
instanceof JButton){
			JButton bu=(JButton)sour;
			String lab=bu.getText();
			System.out.println("我按下了按钮 "+lab);
			
		}else{
			
			System.out.println("其他组件发生事件");
		}
		
		JButton bu=new JButton("登陆");
		bu.addActionListener(mb);
		
		
	}
	
	
}
注:instanceof是Java、php的一个二元
caozuofu.html" target="_blank">操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留
关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。相当于c#中的is操作符。
  3.事件
监听的方法:
监听器方法根据发送的动作来确定。
	假设发生一个鼠标点击的动作,那么要给事件源添加鼠标的监听器方法。
	假设你想让事件源获取焦点时,执行某一件事情,那么你就要给事件源添加焦点事件监听器方法,也叫注册事件监听程序,即重写事件接口方法。
  3.匿名内部类来实例化接口的对象。
这是一种特别的写法,关键是通过内部类创建按钮监听器。看下面一段代码:
ActionListener al = new ActionListener(){
			//实现接口的方法
			public void actionPerformed(ActionEvent e) {
				//获取到按钮上显示的文本信息
				
shapeType = e.getActionCommand();
				System.out.println("shapeType = "+shapeType);
			}	
		};
  原本接口是不能实例化对象,必须在建立一个类来实现它,但用这种方法却可以实现。这是一句声明代码 ,如果花括号内部的代码太长,还是要另外建立一个类来实现。
  以上是事件机制的基本介绍,JAVA中还有许多事件接口需要自己去实践,比如最早我们说到的画板就需要MouseListener这个事件接口。下面是附上自己的代码:
public class DrawingBorder extends JFrame {
	public static void main(String[] args) {
		DrawingBorder db = new DrawingBorder();
		db.initUI();
	}
	//定义一个图形属性
	private String shapeType = "Line";
	
	/**
	 * 获取属性值的方法
	 * @return shapeType属性中的值
	 */
	public String getShapeType(){
		return shapeType;
	}
	
	/**
	 * 初始化界面的方法
	 */
	public void initUI(){
		this.setTitle("简单画板");
		this.setSize(new Dimension(600,500));
		this.set
DefaultClose
Operation(3);
		this.setLocationRelativeTo(null);
		
		//调用创建北边面板的方法
		JPanel northPanel = createNorthPanel();
		this.add(northPanel,BorderLayout.NORTH);
		
		//调用创建中间面板的方法
		JPanel centerPanel = createCenterPanel();
		this.add(centerPanel,BorderLayout.CENTER);
		
		this.setVisible(true);
		
		//获取centerPanel上的画布对象
		Graphics g = centerPanel.getGraphics();
		
		//实例化事件处理类的对象
		DrawingListener dl = new DrawingListener(g,this);
		
		//事件源是centerPanel,要给事件源添加鼠标监听器方法,绑定事件处理类的对象dl
		centerPanel.addMouseListener(dl);
	}
	/**
	 * 创建北边面板的方法
	 * @return 返回创建好的JPanel对象
	 */
	public JPanel createNorthPanel(){
		JPanel panel = new JPanel();
		
		//JPanel默认的布局方式就是流式布局
		
		/**
		 * 匿名内部类来实例化接口的对象。
		 * 实例化一个事件处理类的对象
		 */
		ActionListener al = new ActionListener(){
			//实现接口的方法
			public void actionPerformed(ActionEvent e) {
				//获取到按钮上显示的文本信息
				shapeType = e.getActionCommand();
				System.out.println("shapeType = "+shapeType);
			}	
		};
		
		//定义一个数组
		String [] array = {"Line","Rect","Oval","RoundRect","Polygon"};
		
		//
循环遍历创建JButton对象添加到panel上
		for(int i=0;i<array.length;i++){
			JButton jbu = new JButton(array[i]);
			//给事件源jbu添加动作监听器方法,绑定事件处理类的对象al
			jbu.addActionListener(al);
			panel.add(jbu);
		}
		
		return panel;
	}
	/**
	 * 创建中间面板的方法
	 * @return 返回创建好点的中间面板panel
	 */
	public JPanel createCenterPanel(){
		JPanel panel = new JPanel();
		panel.setBackground(Color.white);
		return panel;
	}
	
}
以及用一个类来实现MouseListener接口:
public class DrawingListener implements MouseListener {
	//属性用来存储按下和释放坐标点的值
	private int x1,y1,x2,y2;
	//定义一个图形属性
	private String shapeType = "Line";
	//画板界面的对象
	private DrawingBorder db;
	
	//声明一个Graphics的对象,用来绘制图形的
	private Graphics g ;
	/**
	 * 构造方法
	 * @param g是要付给属性的画布对象参数
	 */
	public DrawingListener(Graphics g,DrawingBorder db){
		this.g = g;
		this.db = db;
	}
	
	/**
	 * 鼠标再事件源上按下按键时,执行的方法
	 */
	public void mousePressed(MouseEvent e) {
		//获取按下的坐标值
		x1 = e.getX();
		y1 = e.getY();
	}
	/**
	 * 鼠标再事件源上释放按键时,执行的方法
	 */
	public void mouseReleased(MouseEvent e) {
		//获取释放的坐标值
		x2 = e.getX();
		y2 = e.getY();
		if(db.getShapeType().equals("Line")){
			//绘制一条直线
			g.drawLine(x1, y1, x2, y2);
		}else if(db.getShapeType().equals("Rect")){
			g.drawRect(x1, y1, x2, y2);
		}else if(db.getShapeType().equals("Oval")){
			g.drawOval(x1, y1, x2, y2);
		}else if(db.getShapeType().equals("RoundRect")){
			g.drawRoundRect(x1, y1, x2, y2, 1, 3);
		}
	}
	public void mouseClicked(MouseEvent e) {
	}
	public void mouseEntered(MouseEvent e) {
	}
	public void mouseExited(MouseEvent e) {
	}
}