事件机制_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 事件机制

事件机制

 2013/11/20 0:27:44  linhaoxiang  程序员俱乐部  我要评论(0)
  • 摘要:事件机制假设我们要编写一个画图板软件,想想我们画图板上需要哪些东西,首先肯定要有一个窗体,之后肯定要有几个面板,还要有按钮,或许还要有标签,有了这些组件之后我们还要让这些组件来实现我们的功能,比如点直线按钮,就可以画直线,点正方形按钮就可以画出正方形,如何才能实现这些功能呢,这就要说到事件机制了。1.事件的概念:事件处理时界面处理的基本功能。当我们点下鼠标时,Swing界面上获得的焦点组件都会收到一个事件通知,这是Swing系统内部发出的,界面就会根据收到的事件通知做出相应的处理。2
  • 标签:事件
   事件机制
  假设我们要编写一个画图板软件,想想我们画图板上需要哪些东西,首先肯定要有一个窗体,之后肯定要有几个面板,还要有按钮,或许还要有标签,有了这些组件之后我们还要让这些组件来实现我们的功能,比如点直线按钮,就可以画直线,点正方形按钮就可以画出正方形,如何才能实现这些功能呢,这就要说到事件机制了。
  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.setDefaultCloseOperation(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) {

}
}
发表评论
用户名: 匿名