java匿名类监听器

监听器类是特意为创建一个GUI组件而设计的监听器对象.监听器类是不被其他应用程序所共享的.正确的做法是将它作为一个内部类定义在框架类中.
可以使用匿名内部类简化内部类监听器.匿名内部类是没有名字的内部类.
例如
     public ControlCircle(){
          jbtEnlage.addActionListener(
               new EnlargeListener());
     }

     class EnlargeListener implements ActionListener{
           public void actionPerformed(ActionEvent e)
           {
                canvas.enlarge();
           }    
     }

     可以替换为
     public ControlCircle(){
          jbtEnlarge.addActionListener(
          new AciotnListener(){
               public void actionPerformed(AciotnEvent e){
                    canvas.enlarge();
               }
          }
          );
     }

     匿名内部类的语法如下:
     new SuperClassName/InterfaceName(){
          //
          //
     }

匿名内部类必须总是扩展父类或实现接口,但是不能有显式的extends或implements语句
匿名内部类必须事先父类或者接口中的所有抽象方法
匿名内部类总是使用父类的无参构造方法来创建实例
import  javax.swing.*;
import  java.awt.event.*;

public  class  AnonymousListenerDemo  extends  JFrame{
         public  AnonymousListenerDemo(){
              
              JButton jbtNew =  new  JButton( "New"  );
              JButton jbtOpen =  new  JButton( "Open"  );
              JButton jbtSave =  new  JButton( "Save"  );
              JButton jbtPrint =  new  JButton( "Print"  );
              
              JPanel panel =  new  JPanel();
              panel.add(jbtPrint);
              panel.add(jbtSave);
              panel.add(jbtOpen);
              panel.add(jbtNew);
              
              add(panel);
              
              jbtNew.addActionListener(
                             new  ActionListener(){
                                    public  void  actionPerformed(ActionEvent e){
                                         System.  out .println( "Process new"  );
                                  }
                           }
              );
              
              jbtOpen.addActionListener(
                             new  ActionListener(){
                                    public  void  actionPerformed(ActionEvent e){
                                         System.  out .println( "Process open"  );
                                  }
                           }
              );
              
              jbtPrint.addActionListener(
                             new  ActionListener(){
                                    public  void  actionPerformed(ActionEvent e){
                                         System.  out .println( "Process print"  );
                                  }
                           }
              );
              
              jbtSave.addActionListener(
                             new  ActionListener(){
                                    public  void  actionPerformed(ActionEvent e){
                                         System.  out .println( "Process save"  );
                                  }
                           }
              );
              
       }
       
         public  static  void  main(String[] args)
       {
              JFrame frame =  new  AnonymousListenerDemo();
              frame.setTitle(  "AnonymousListenerDemo" );
              frame.setDefaultCloseOperation(JFrame.  EXIT_ON_CLOSE );
              frame.setLocationRelativeTo(  null );
              frame.pack();
              frame.setVisible(  true );
       }

}

也可以只创建一个监听器,将这个监听器注册给按钮,让后让监听器检测出事件源.对于每种事件写不同的执行方法

可修改为: 
     ButtonListener listener = new ButtonListener();
     jbtNew.addActionListener(listener);
     jbtSave.addActionListener(listener);
     jbtOpen.addActionListener(listener);
     jbtPrint.addActionListener(listener);
     
     class ButtonListener implements ActionListener{
          public void actionPerformed(ActionEvent e){
               if(e.getSource() == jbtNew)
               {
                     System.  out  .println( "Process new"  );
               }
               else if(e.getSource() == jbtSave)
               {
                     System.  out  .println( "Process save"  );
               }
               else if(e.getSource() == jbtOpen)
               {
                     System.  out  .println( "Process open"  );
               }
               else if(e.getSource() == jbtPrint)
               {
                     System.  out  .println( "Process print"  );
               }
          }
     }




窗口事件:
     windows类或者windows任何子类都可能触发WindowEvent。JFrame是Windows的子类,因此也可以触发WindowEvent
激活窗口,关闭窗口,正在关闭窗口,变成非活动的窗口,最小化窗口,还原窗口或打开窗口。

import  java.awt.event.*;
import  javax.swing.*;

public  class  TestWindowEvent  extends  JFrame{
         public  static  void  main(String[] args){
              TestWindowEvent frame =  new  TestWindowEvent();
              frame.setTitle(  "TestWindowEvent" );
              frame.setSize(220,80);
              frame.setDefaultCloseOperation(JFrame.  EXIT_ON_CLOSE );
              frame.setLocationRelativeTo(  null );
              frame.setVisible(  true );
       }
       
         public  TestWindowEvent(){
              addWindowListener(  new  WindowListener() {
                     
                       public  void  windowDeiconified(WindowEvent event)
                     {
                           System.  out .println( "Window deiconified"  );
                     }
                     
                       public  void  windowIconified(WindowEvent event){
                           System.  out .println( "Window iconified"  );
                     }
                     
                       public  void  windowActivated(WindowEvent evnet){
                           System.  out .println( "Window activated"  );
                     }
                     
                       public  void  windowDeactivated(WindowEvent event){
                           System.  out .println( "Window deactivated"  );
                     }
                     
                       public  void  windowOpened(WindowEvent event){
                           System.  out .println( "Window opened"  );
                     }
                     
                       public  void  windowClosing(WindowEvent event){
                           System.  out .println( "Window closing"  );
                     }
                     
                       public  void  windowClosed(WindowEvent event){
                           System.  out .println( "Window closed"  );
                     }
              }
              );
       }
}

监听器接口适配器:
     因为WindowListener接口中的方法是抽象的,所以使用时必须事先所有方法。为了方便,java提供方便适配器的支持类。它提供监听器中所有方法的默认实现。每个XListener的方便监听器适配器命名为XAdapter.
     这样如果只对激活窗口事件感兴趣,使用WindowAdapter可以简化前面的例子。
      import  java.awt.event.*;
import  javax.swing.*;

public  class  AdapterDemo  extends  JFrame{
         public  static  void  main(String[] args){
              AdapterDemo frame =  new  AdapterDemo();
              frame.setSize(220,80);
              frame.setLocationRelativeTo(  null );
              frame.setDefaultCloseOperation(JFrame.  EXIT_ON_CLOSE );
              frame.setTitle(  "AdapterDemo" );
              frame.setVisible(  true );
       }
       
         public  AdapterDemo(){
              addWindowListener(  new  WindowAdapter(){
                       public  void  windowActivated(WindowEvent event){
                           System.  out .println( "Window activated"  );
                     }
              });
       }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值