java学习笔记图形程序设计及GUI应用小结(2)

来源:互联网 发布:cst仿真软件 编辑:程序博客网 时间:2024/05/19 09:09


事件处理:

通常人们将他们称为事件过程。在AWT所知的事件范围内,完全可以控制事件从事件源例如按钮或滚动条,到事件监听器的传递过程,并将任何对象指派给事件监听器。像Java这样的面向对象语言,都将事件的相关信息封装在一个事件对象中。


事件监听机制

事件源(组件)   事件(Event)   监听器(Listener)   事件处理(引发事件后处理方式)


事件监听机制的特点:

1、事件源:就是awt包或swing包中那些图形界面组件。

2、事件:每一个事件源都有自己特有的对应事件和共性事件。

3、监听器:将可以出发某一个事件的(不止一个动作)动作都已经封装到了监听器中。

以上三者在java中已经定义完成,直接获取其对象来用就可以。不需写代码。我们要对产生的动作进行处理。


定义监听必须要实现ActionListener接口。为了实现ActionListener接口,监听器必须有一个被称为actionPerformed的方法,该方法接收一个ActionEvent对象参数。可以将多个监听对象添加到一个像按钮这样的事件源中。任何实现了ActionListener接口的类对象都可以作为按钮监听。

当监听对象不能访问其所操作的对象的变量时,可以采用内部类的方式,即将监听对象设为其要进行操作对象的内部类。这种情形经常会遇到。事件监听器对象通常需要进行一些对其他对象可能产生影响的操作。可策略性地将监听器类放置在需要修改状态的哪个类中。


使用匿名内部类简化代码的实例:

1、用标签字符串构造按钮。              2、将按钮添加到面板上 

3、用对应的颜色构造一个动作监听器      4、添加动作监听器

public voidmakeButton(String name,final Color backgroundColor)

{

       JButton button = new JButton(name);

       buttonPanel.add(button);

       button.addActionListener(newActionListener()  // 监听仅使用一次,使用匿名内部类

       {

              public voidactionPerformed(ActionEvent event)  // 实现方法actionPerformed

              {

                     buttonPanel.setBackground(backgroundColor);

              }

       });

}


当不愿使用内部类时,找出因事件而改变的容器,让这些容器实现ActionListener接口,    然后容器将自身设置为监听器:yellowButton.addActionListener(this);因此actionPerformed方法必须判断点击了哪个按钮:

       classButtonFrame extends JFrame implements ActionListener

       {

              …

              public void actionPerformed(ActionEventevent)

              {

                     Object source =event.getSource();  // 定义一个事件源对象。

                     if(source==yellowButton)…  // 当事件源为指定组件。

                     else if(source==blueButton)…

                     else if(source==redButton)…

                     else…

              }

       }


当程序用户试图关闭一个框架窗口时,JFrame对象就是WindowEvent的事件源。如果希望捕获这个事件,就必须有一个合适的监听对象,并将它添加到框架的窗口监听器列表中。

WindowListenerlistener = …;

frame.addWindowListener(listener);


窗口监听器必须是实现WindowListener接口的类的一个对象。在WindowListener几口中包含7个方法。当发生窗口事件时,框架将调用这些方法响应7个不同的事件,从他们的名字就可以得知作用,唯一的例外是在Windows下,通常将iconified(图标化)称为minimized(最小化)。实现一下接口可以只对需要的方法进行复写。

publicinterface WindowListener

{

       void windowOpened(WindowEvent e);     void windowClosing(WindowEvent e);

       void windowClosed(WindowEvent e);      void windowIconified(WindowEvent e);

       void windowDeiconified(WindowEvente);  void windowActivated(WindowEvent e);

       void windowDeactivated(WindowEvent e);

}


每个含有多个方法的AWT监听器接口都配有一个适配器类(adapter)这个类实现了接口中的所有方法,但每个方法没有做任何实情。可以通过扩展适配器类来指定对某些事件的响应动作,而不必实现接口中的每个方法。


适配器的使用:

classTerminator extends WindowAdapter

{

       public void windowClosing(WindowEvent e)

       {

              if(user agrees)

                     System.exit(0);

       }

}

现在可以将一个Terminator对象注册为事件监听:

WindowListenerlistener = new Terminator();

frame.addWindowListener(listener);   // 单击关闭退出。

还可以将监听器类定义为框架的匿名内部类:

frame.addWindowListener(newWindowAdapter(){

       public void windowClosing(WindowEvent e)

       {

              if(user agrees)

                     System.exit(0);

       }

})


事件方法说明:

java.awt.event.WindowListener 1.2

voidwindowOpened(WindowEvent e)  窗口打开后调用这个方法

void windowClosing(WindowEvente)  在用户发出窗口管理器命令关闭窗口时调用此方法。

voidwindowClosed(WindowEvent e)  窗口关闭后调用这个方法

voidwindowIconified(WindowEvent e)   窗口图标化后调用这个方法

voidwindowDeiconified(WindowEvent e)  窗口非图标化后调用这个方法

voidwindowActivated(WindowEvent e)  激活窗口后调用这个方法。只有框架或对话框可

voidwindowDeactivated(WindowEvent e)  窗口变为未激活状态后调用这个方法

voidwindowStateChanged(WindowEvent e) 

窗口被最大化、图标化或恢复为正常大小时调用这个方法

intgetNewState() 1.4

intgetOldState() 1.4 

返回窗口状态改变事件中窗口的新、旧状态。返回的整型数值是下列数值之一:

Frame.NORMAL           Frame.iconified            Frame.MAXIMIZED_HORIZ

Frame.MAXIMIZED_VERT       Frame.MAXIMIZED_BOTH


Swing包提供了一种非常实用的机制来封装命令,并将他们连接到多个事件源,这就是Action接口。一个动作是一个封装下列内容的对象:命令的说明、执行命令所需要的参数。Action接口扩展于ActionListener接口。

Action接口包含下列方法:

voidactionPerformed(ActionEvent event)

voidsetEnabled(Boolean b)

booleanisEnabled()  // 启用或禁用这个动作,并检查当前是否启用

voidputValue(String key,Object value)

ObjectgetValue(String key)

voidaddPropertyChangeListener(PropertyChangeListener listener)

voidremovePropertyChangeListener(PropertyChangeListener listener)


Action是一个接口而不是一个类。实现这个接口的所有类都必须实现刚才讨论的7个方法。庆幸的是,有一个类存储了所有名/值对,并管理着属性变更监听器。我们可直接扩展AbstractAction类并在扩展类中实现actionPerformed方法。


鼠标事件监听:

当用户点击鼠标按钮时,将会调用三个监听器方法:鼠标第一次被按下时调用mousePressed;鼠标被释放时调用mouseReleased;最后调用mouseClicked。

用MouseEvent类对象作为参数,调用getX和getY方法可以获得鼠标被按下时鼠标指针所在的x和y坐标。要想区分单击、双击和三击(!),需要使用getClickCount方法。

getModifiersEx方法能够准确地报告鼠标事件的鼠标按钮和键盘修饰符。

可以使用下列代码检测鼠标右键是否被按下:

if((event.getModifiersEx()&InputEvent.BUTTON3_DOWN_MASK)!=0)//code for right click

鼠标点击和鼠标移动有两个独立的接口MouseListener和MouseMotionListener。可提高效率。当用户移动鼠标时,只关心鼠标点击的监听器就不会被多余的鼠标移动所困扰。

用户在移动鼠标的同时按下鼠标,就会调用mouseMoved而不是调用mouseDragged。

还有两个鼠标事件方法:mouseEntered和mouseExited这两个方法是在鼠标进入或移出组件时被调用。

鼠标点击由mouseClicked过程报告,它是MouseListener接口的一部分。鼠标移动事件与拖动事件定义在一个称为MouseMotionHandler的独立接口中。


共性事件(鼠标键盘事件)

MouseListener和KeyListener监听。

MouseListener中的五个方法:(参数都一样为MouseEvent e)

mouseClicked(MouseEvente)、mouseEntered、mouseExited、mousePressed、mouseReleased

MouseEvent类:其中有getClickCount方法,获取与此事件关联的鼠标单击次数。

InputEvent类:

importjava.awt.*;

importjava.awt.event.*;

classMouseAndKeyEvent

{

         private Frame f;   // 在定义使用范围较广

         private Button but;

         private TextField tf;      

         MouseAndKeyEvent ()   //  构造函数

         {

                   init();    //  初始化时进行设置

         }

         public void init()   // 定义方法用于基本设置

         {

                   f = new Frame(“my frame”);

                   f.setBounds(300,100,600,500);

                   f.setLayout(newFlowLayout());

                   but = new Button(“my button”);

                   tf = new TextField(20);   // 实例化一个文本框,并设置列数为20

                   f.add(tf);   // 将文本框添加到窗体中

                   f.add(but);

                   myEvent();

                   f.setVisible(true);

         }

         private void myEvent()  //  定义方法用于监听

         {

                   f.addWindowListener(newWindowAdapter()

                   {

                            public void windowClosing(WindowEvente)

                            {

                                     System.exit(0);

                            }

                   });

        

                  //给but按钮添加一个键盘监听

                   but.addKeyListener(newKeyListener()

                   {

                            public voidkeyPressed(KeyEvent e)

                            {

                                     //  打印键盘输入的字符和其对应的Code码

                                     System.out.println(e.getKeyChar()+”…”+e.getKeyCode());

                                     // 根据Code码获取其对应的字符

                                     System.out.println(KeyEvent.getKeyText(e.getKeycode()+”..”+e.getKeyChar()));

                                     // 当按下ESC时退出if(e.getKeyCode()==KeyEvent.VK_ESCAPE)

                                     if(e.getKeyCode()==27)

                                               System.exit(0);   

                                    

                                     // 组合键演示。按住control在按回车。

                                     if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)

                                               System.out.println(“ctrl+enteris run”);

                            }

                   });

        

                   //  为文本框添加监听,判断输入是否为数字

                   tf.addKeyListener(newKeyListener()

                   {

                            public voidkeypress(KeyEvent e)

                            {

                                     int code =e.getKeyCode();

                                     if(!(code>= Key.Event.VK_0 && code <= Key.Event.VK_9))

                                     {

                                               System.out.println(code+”…是非法的”);

                                               e.consume();   // 取消动作。输入不进去。

                                     }

                            }

                   });

 

                   //  为按钮添加活动监听

                   but.addActionListener(newActionListener()  

                   {

                            public voidwindowClosing(WindowEvent e)  // Click事件先执行。但action鼠标键盘都有效。

                            {

                                     System.out.println(“actionok”);

                            }

                   });

 

                   //  为按钮添加鼠标事件监听,             

                   but.addMouseListener(new MouseListener()     //设置监听MouseListener

                   {

                            private int count =1;

                            private intclickCount = 1;

                            public void mouseEntered(MouseEvente)  // 鼠标移入按钮上所发生的事件。

                            {

                                     System.out.println(“鼠标进入到该组件”+count++);

                            }

                            public voidmouseClicked(MouseEvent e)  // 鼠标单击按钮所发生的事件

                            {

                                     if(e.getClictCount()==2)   //  改成双击动作。

                                              System.out.println(“双击点击动作”+clickCount++);

                            }

                   });

         }

         public static void main(String[]args)    // 主函数执行

         {

                   new MouseAndKeyEvent();

         }

}

 

鼠标事件方法说明:

java.awt.event.MouseEvent 1.1

int getX()

int getY()

PointgetPoint()  返回事件发生时事件源组件左上角坐标x(水平)和y(数值)或点信息

intgetClickCount()  返回与事件关联的鼠标连击次数。


AWT将事件分为低级事件和语义事件。语义事件是表示用户动作的事件,例如点击按钮;因此,ActionEvent是一种语义事件。低级事件是形成那些事件的事件。在点击按钮时,包含了按下鼠标、连续移动鼠标、抬起鼠标(只有鼠标在按钮区中抬起才引发)事件。或者在用户利用TAB键选择按钮,并利用空格键激活他们时,发生的敲击键盘事件。同样,调节滚动条是一种语义事件,但拖动鼠标是低级事件。


java.awt.event包中最常用的语义事件类:

ActionEvent(对应按钮点击、菜单选择、选择列表项或在文本框中ENTER);

AdjustmentEvent(用户调节滚动条);

ItemEvent(用户从复选框或列表框中选择一项)


常用的5个低级事件类:

KeyEvent(一个键被按下或释放);

MouseEvent(鼠标键被按下、释放、移动或拖动);

MouseWheelEvent(鼠标滚轮被转动);

FocusEvent(某个组件获得焦点或失去焦点);

WindowEvent(窗口状态被改变);

例子:实现窗体的关闭功能

importjava.awt.*;

import java.awt.event.*;   // 图形化界面需要导入两个包。

classAwtDemo

{

         public static void main(String[] args)

         {

                   Frame f = new Frame(“my awt”);  // 默认无参数构造函数为显示补可见。参数为标题。

                   f.setSize(500,100);   // 设置窗体尺寸,宽500,高100

                   f.setLocation(300,200);    // 设置窗口初始化在屏幕的位置

                   f.setLayout(newFlowLayout());   // 设置一个新布局。

                   Button b = new Button(“我是一个按钮”);    // 设置一个按钮,显示值为我是一个按钮。

                   f.add(b);   // 将按钮添加到面板上。Frame的默认布局为边界布局,按钮会很大。

                   f.setVisible(true);    // 设置可见。但图形化界面是由另外一个线程来控制的

                   //   System.out.println(“Hello World!”);

                   // 添加动作监听

                   // 参数为WindowListener l 接口类型要覆写其中的全部七个方法。

                   //  f.addWindowListener(WindowListener); 

                  

                   f.addWindowListener(newMyWin());   // 参数为定义的类的对象。故参数为一个匿名内部类也可以

                  

                   //  匿名内部类为参数

                   f.addWindowListener(newMyWin()

                   {

                            public voidwindowClosing(WindowEvent e)    // 关闭事件

                            {

                                     System.out.println(“windowclosing”+e.toString());  

                                     System.exit(0);   // 退出系统。

                            }

                            public voidwindowActivated(WindowEvent e)  // 活动事件(可执行多次)

                            {

                                     System.out.println(“我活了!”);  

                            }

                            public voidwindowActivated(WindowEvent e)                   //打开事件(仅执行一次)

                            {

                                     System.out.println(“我被打开了”);  

                            }

                   });

                  

                   // WindowListener l 有四个子类,其中有一个抽象类WindowAdapter(),已经复写了七个方法。

         }

}



0 0
原创粉丝点击