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" );
                     }
              });
       }

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值