java的事件驱动

事件和事件源:
     事件可以定义为程序发生了某些事情的信号.能创建一个事件并触发该事件的组件称为该事件的源对象或源组件.事件类的根类是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  );
              }
       }
}


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

内部类可以引用定义在它所嵌套的外部类中的数据和方法
内部类的对象经常在外部类中创建
内部类的应用就是将从属类合并到主类中,可以减少源文件数量,便于管理
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值