java的事件驱动

来源:互联网 发布:mac ae导出快捷键 编辑:程序博客网 时间:2024/05/29 08:18
事件和事件源:
     事件可以定义为程序发生了某些事情的信号.能创建一个事件并触发该事件的组件称为该事件的源对象或源组件.事件类的根类是java.util.EventObject

事件对象包括与事件相关的一切属性,可以使用EventObject中的实例方法getSource()获得事件的源对象。EventObject的子类的对象处理特定类型的事件。如动作事件,窗口事件,组件事件,鼠标事件,按键事件。

java使用一种基于委托的模型来处理事件:原对象触发一个事件,对此事件感兴趣的对象来处理它。将对此事件感兴趣的对象称为监听器(listener)一个对象要成为原对象上的事件监听器,需要具备两个条件。

(1)调用source.addXListener(listener)来注册一个实例。注册方法依赖于事件的类型。如果事件类型是ACtionEvent,那么对应的注册方法是addActionListener.一般来说XEvent的注册命名方法是addXListener.
一个源对象可以触发几种类型的事件。
(2)要定义监听器对象的类,确保监听器有处理这个事件的正确方法。java为每一种类型的事件都提供了监听器接口。通常XEvent的监听器接口是XListener,监听器MouseMotionListener例外。ActionListener的每个 监听器都应该实现ActionListener接口。


注册一个监听器:
     JButton jbtOK = new JButton("OK");
     ActionListener listener1 = new OKListenerClass();
     jbtOK.addActionListener(listener1);

事件对象包含于事件相关的信息,为判断一个对象是按钮,复选框还是单选按钮,,都可以使用e.getSource()方法获得源对象。

写一个程序用两个按钮控制圆的大小
(1)定义名为EnlargeListener的监听类,实现ActionListener
(2)创建一个监听器,并将其注册到jbtEnlarge
(3)在CirclePanel中添加一个名为enlarge()的方法来增加半径,然后重绘
(4)实现EnlargeListener中的actionPerformed方法来调用canvas.enlarge()
(5)为了让actionPerformed方法能够访问引用变量canvas,将EnlargeListener定义为ControlCircle类的内部类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ControlCircle extends JFrame {
        private JButton jbtEnlarge = new JButton("Enlarge");
        private JButton jbtShrink = new JButton("Shrink");
        private CirclePanel canvas = new CirclePanel();
       
        public ControlCircle(){
              JPanel panel = new JPanel();
              panel.add( jbtEnlarge);
              panel.add( jbtShrink);
              
               this.add(canvas ,BorderLayout.CENTER);
               this.add(panel,BorderLayout.SOUTH);
              
               jbtEnlarge.addActionListener(new EnlargeListener());
              
       }
       
        public static void main(String[] args){
              JFrame frame = new ControlCircle();
              frame.setTitle( "ControlCircle");
              frame.setLocationRelativeTo( null);
              frame.setSize(200,200);
              frame.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE);
              frame.setVisible( true);
       }
       
        class EnlargeListener implements ActionListener{
               public void actionPerformed(ActionEvent e){
                      canvas.enlarge();
              }
       }
       
        class CirclePanel extends JPanel{
               private int radius = 5;
              
               public void enlarge(){
                      radius++;
                     repaint();
              }
       
       
               protected void paintComponent(Graphics g){
                      super.paintComponents(g);
                     g.drawOval(getWidth()/2 - radius,getHeight()/2 - radius, 2 * radius, 2 * radius );
              }
       }
}


内部类:
     定义在另一个类范围内的类成为内部类。内部类可以像常规类一样使用。如果内部类只是被外部类使用,那就将该类定义为内部类。

内部类可以引用定义在它所嵌套的外部类中的数据和方法
内部类的对象经常在外部类中创建
内部类的应用就是将从属类合并到主类中,可以减少源文件数量,便于管理
原创粉丝点击