Java Swing之事件处理

        一、事件处理机制
        1.概述

Swing组件中的事件处理专门用于响应用户的操作,比如窗口操作、菜单操作、按钮操作、条目(选项)操作等。

        在java语言中,事件不是由事件源自己来处理的,而是交给事件监听者来处理,要将事件源(如按钮)和对事件的具体处理分离开来。这就是所谓的事件委托处理模型。

        事件委托处理模型由产生事件的事件源、封装事件相关信息的事件对象和事件监听者三方面构成。例如,当按钮被鼠标点击时,会触发一个“操作事件(ActionEvent)”,Java系统会产生一个“事件对象”来表示这个事件,然后把这个事件对象传递给“事件监听者”,由事件监听者指定相关的|接口方法进行处理。为了使事件监听者能够接受到事件对象的信息,事件监听者要事先向事件源进行注册。

        2.事件处理对象

        (1)事件源(Event Source):事件发生的场所,通常就是产生事件的组件,例如窗口、按钮、菜单等;

        (2)事件对象(Event):是指封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。

        (3)监听器(Listener):负责监听事件源上发生的事情,并对各种事件作出相应处理的对象。不同的组件可以注册的监听器一般不同,都是基于组件自身的功能设置的监听器。常用监听器 如下表所示。

监听器        功能

AdjustmentListener

用于接收调整事件的侦听器接口。

FocusListener

用于在组件上接收键盘焦点事件的侦听器界面。

KeyListener

用于接收键盘事件(按键)的侦听器界面。

MouseListener

用于在组件上接收“有趣”鼠标事件(按,释放,单击,输入和退出)的侦听器界面。

MouseWheelListener

用于在组件上接收鼠标滚轮事件的侦听器界面。

TextListener

用于接收文本事件的侦听器界面。

WindowListener

用于接收窗口事件的侦听器界面。

WindowStateListener

用于接收窗口状态事件的侦听器接口。

        还有些其他的监听器,可以结合组件的使用,通过方法调用的方式查看可以注册的监听器,通过文档说明了解其功能。

        3.事件处理流程

        事件处理的流程反映了事件对应的功能实现的逻辑,其流程可以用如下图来表示。

        二、鼠标事件

        在图形用户界面中,用户会经常使用鼠标来进行选择、切换界面等操作,这些操作被定义为鼠标事件,主要包括鼠标按下、鼠标松开、鼠标单击、鼠标移入、鼠标退出等。

        1.主要事件及处理方法
鼠标事件        处理方法
鼠标单击(鼠标按钮按下并释放)mouseClicked(MouseEvent e)
鼠标按下(鼠标按钮按下)mousePressed(MouseEvent e)
鼠标释放(鼠标按钮释放)mouseReleased(MouseEvent e)

鼠标进入(鼠标移入组件区域)      

mouseEntered(MouseEvent e)
鼠标退出(鼠标从组件区域退出)mouseExited(MouseEvent e)
       2.常用监听器

        (1)MouseListener监听器

        该监听器的功能是监听鼠标事件(MouseEvent)。事件源(产生鼠标操作的组件对象)调用addMouseListener()方法注册监听器,使用MouseEvent类表示鼠标事件,常用处理方法如上表所示。

        (2)MouseMotionListener监听器

        该监听器监听对于鼠标的移动和拖放操作事件。

        MouseMoved(MouseEvent e)方法处理鼠标移动事件

        MouseDrag(MouseEvent e)处理鼠标拖放事件

        3.处理事件模式

       (1)使用MouseListener接口处理事件

         重写关于鼠标操作的全部5个方法,完成既定功能,举例如下:        

JButton btn1 = new JButton("测试按钮");
btn1.setSize(100,30);
btn1.setLocation(250,80);
btn1.addMouseListener(new MouseListener(){
    public void mouseReleased(MouseEvent e) {
         JOptionPane.showMessageDialog(null, "鼠标放开事件");
    }
    public void mousePressed(MouseEvent e) {
	    JOptionPane.showMessageDialog(null,"鼠标按下事件");
    }
    public void mouseExited(MouseEvent e) {
	    JOptionPane.showMessageDialog(null,"鼠标退出按钮区域");
    }
    public void mouseEntered(MouseEvent e) {
	    JOptionPane.showMessageDialog(null,"鼠标移入按钮区域");
    }
    public void mouseClicked(MouseEvent e) {
	    JOptionPane.showMessageDialog(null,"用户点击了按钮");
    }	
});		

(2)使用MouseAdapter接口处理事件

       使用MouseAdapter接口处理鼠标事件,这个接口是MouseListener的扩展,要重写的接口根据需要确定,不必全部重写5个方法。举例代码如下。

JButton btn2 = new JButton("btn2");
btn2.setSize(100,30);
btn2.setLocation(170,30);
btn2.addMouseListener(new MouseAdapter() {
//只重写一个需要的方法即可
    public void mouseClicked(MouseEvent e) {
	    JOptionPane.showMessageDialog(null,"用户点击了按钮btn2");
    }	
});

    (3)使用ActionListener接口处理事件(动作事件)

       使用该接口时,只需要重写actionPerformed(ActionEvent e)方法即可,基本能完成多数按钮单击对应的功能,示例代码如下。

JButton btn = new JButton("按钮");
btn.addActionListener(new ActionListener() {
	public  void actionPerformed(ActionEvent e) {
		JOptionPane.showMessageDialog(null, "单击按钮");
	}
}

现。示例代码如下。

        三、动作事件

        不代表某类事件,只是表示一个动作发生了,如关闭文件事件(可能是用键盘关闭,也可以是用鼠标关闭)。

        动作事件用ActionEvent类表示,注册监听和处理事件要实现ActionListener接口。

        常用的方法有getActionCommand(),用以返回产生动作的事件源对象。

        该类时间监听器的注册与方法应用见前面鼠标事件处理模式中示例。

        四、键盘事件

        键盘事件是指程序运行中,针对键盘上某键的按下、释放、键入动作的事件。

        使用KeyEvent类表示键盘事件,实现KeyListener接口或继承KeyAdapter适配器类,使用addKeyListener()方法在事件源上注册监听器。

        1.使用KeyListener接口处理事件

        注册监听要重写接口中的三个方法:当某键按下后重写调用KeyPressed(keyEvent e)方法,键释放后重写调用KeyReleased(KeyEvent e)方法,键入键时重写KeyTyped(KeyEvent e)方法。

        示例代码如下:

JTextField txt = new JTextField();//创建一个文本框
txt.setSize(140,40);
txt.setLocation(230, 100);
txt.addKeyListener(new KeyListener() {//使用keyListener类,重写三个抽象方法
     public void keyPressed(KeyEvent e) {
          char keychar = e.getKeyChar();//获取键盘键入的字符
          JOptionPane.showMessageDialog(null, "键盘按下的字符为"+String.valueOf(keychar));
     }
     public void keyReleased(KeyEvent e) {   }//该事件不做处理
     public void keyTyped(KeyEvent e) {  } //该事件不做处理
});
        2.继承KeyAdapter适配器类处理事件

        KeyListener接口中的三个方法(按下键、释放键、键入键)可以不必全部实现,根据需要实现一个或多个即可,即只重写需要的方法即可。改写前面的程序代码如下:

JTextField txt = new JTextField();
txt.setSize(140,40);
txt.setLocation(230, 100);
txt.addKeyListener(new KeyAdapter() {//使用KeyAdapter适配器类根据需要重写方法
     public void keyPressed(KeyEvent e) {//只重写按下键方法即可
            char keychar = e.getKeyChar();
            JOptionPane.showMessageDialog(null, "键盘按下的字符为"+String.valueOf(keychar));
      }
});
        五、窗体事件

        对窗体(JFrame)的各种操作行为都属于窗体事件,如窗体的打开、关闭、激活、停用等。Java中使用WindowsEvent类表示窗体事件,使用WidowsListener接口的实现处理窗体事件。

        1.常见窗体事件

        windowOpened,打开窗体

        windowActivated ,激活(获得焦点状态)窗体

        windowDeactivated,窗体非激活(失去焦点状态)

        windowIconified,最小化窗体

        windowDeiconified,最小化窗体并恢复正常

        windowClosing ,关闭(右上角X),优先于windowClosed

        windowClosed ,关闭,使用常数DISPOSE_ON_CLOSE时才会被调用

       2.处理模式

       使用addWindowListener( )方法注册监听器到事件源上(绑定事件源对象),重写前面提到7个有关方法。简单举例如下。

JFrame frame = new JFrame("窗体事件处理示例");
frame.addWindowListener(new WindowListener() {

	@Override
	public void windowOpened(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosing(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosed(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowActivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}
	
});

      以上就JavaSwing中事件处理机制及常见事件简单介绍,详细内容可查阅官方说明文档。从事件源角度,对应Java Swing中不同的组件会产生不同的事件,注册的监听器也不同,后续会就组件监听及事件处理做举例介绍。                      

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值