gui事件处理机制

举报
泽宇-Li 发表于 2021/05/26 15:00:40 2021/05/26
【摘要】 主要内容:         Java事件处理机制         常见事件及处理接口         Java绘图机制▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ Java事件处理机制===============================================简介:       Java事件处理机制是一种基于授权的事件处理机制。----...

主要内容:
         Java事件处理机制
         常见事件及处理接口
         Java绘图机制

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔

 Java事件处理机制
===============================================
简介:
       Java事件处理机制是一种基于授权的事件处理机制。

-----------------------------------------------------------------------------------------------------------------------
事件处理中的主要概念:

     事件源,能够产生事件的对象都可以成为事件源 .

     监视器,负责监视事件源的对象,当事件源产生事件时,监视器将调用方法对事件进行处理。
                    事件源通过调用相应的方法将某个对象注册为自己的监视器。
                     对于文本框,这个方法是:addActionListener(监视器);
                     java语言中监视器都是使用接口来实现的。
                    事件源注册监视器之后,相应的操作就会导致相应的事件的发生,并通知监视器,监视器就会作出相应的处理。 


     事件处理接口,接口中定义了处理事件的方法。
                                监视器负责处理事件源发生的事件。
                                监视器是一个对象,为了处理事件源发生的事件,监视器这个对象会自动调用接口中一个方法来处理事件。 
                                Java规定:为了让监视器这个对象能对事件源发生的事件进行处理,
                               创建该监视器对象的类必须声明实现相应的接口,那么当事件源发生事件时,监视器就自动调用被类重写的某个接口方法。
----------------------------------------------------------------------------------------------------------------------------
事件处理步骤:
1.写一个监视器类
     class Pliceman implements XXXListener
     {

          接口方法(XXXEvent e)
          {
               //.......
           }
      }

2.创建事件源、监视器对象

3.事件源注册监视器
     事件源.addXXXListener(监视器);


---------------------------------------------


常见事件及处理接口
=========================================================

ActionEvent事件    ***
-------------------------------------------------------------------------------------
 1 ActionEvent事件源 :
    文本框、按纽、菜单项、密码框和单选按纽都可以触发ActionEvent事件,即都可以成为ActionEvent事件的事件源。 
 2.注册监视器: ActionListener接口作为监视器

    事件源.addActionListener(ActionListener listen)

    将实现ActionListener接口的类的实例注册为事件源的监视器。 

 3.ActionListener接口:重写接口中的方法作为事件处理。
    ActionListener接口在java.awt.event包中,该接口中只有一个方法:
                     public void actionPerformed(ActinEvent e) ;

        事件源触发ActionEvent事件后,监视器将发现触发的ActionEvent事件,然后调用接口中的这个方法对发生的事件作出处理。
        ActionEvent类事先创建的事件对象就会传递给该方法的参数e。 
 
 4.ActionEvent类中的方法:下面的方法能够获取发生动作的事件源。
            public Object getSource() --------- 调用该方法可以获取发生ActionEvent事件的事件源对象的引用。
            public String getActionCommand()  ---------  调用该方法可以获取发生ActionEvent事件时,和该事件相关的一个命令字符串。
-------------------------------------------------------------------------------------------

-----------------------------------
带事件处理的GUI程序总结:
通常有3各类:
监视器类
public class Pliceman implements ActionListener {
   //取数组的组件
   //显示数据的组件

   //设置取数据组件的方法

   //设置显示数据组件的方法

   //接口中的方法
   public void actionPerformed(ActionEvent e) {
        //取得数据

        //处理数据

        //显示数据
   }
}


窗口类
pulic MainFrame extends JFrame {
   //组件
   //监视器

   public MainFrame() {
       init();
       initEvent();
       //设置窗口的属性
   }

   void init() {
       //设置布局
       //创建组件
       //添加组件
   }

   void initEvent() {
       //创建监视器
       //设置监视器的属性
       //事件源注册监视器
   }

}

主类

--------------------------------------------------------


ItemEvent事件
-----------------------------------------------------------------------------------------------------------
1.ItemEvent事件源 :
           选择框、下拉列表都可以触发ItemEvent事件。
2.注册监视器:ItemListener接口作为监视器
             事件源.addItemListener(ItemListener listen)
             将实现ItemListener接口的类的实例注册为事件源的监视器。 
3.ItemListener接口:重写方法作为事件处理
             ItemListener接口在java.awt.event包中,该接口中只有一个方法
                       public void itemStateChanged(ItemEvent e) 

                 事件源触发ItemEvent事件后,监视器将发现触发的ItemEvent事件,
                 然后调用接口中的itemStateChanged(ItemEvent  e)方法对发生的事件作出处理。
                  ItemEvent类事先创建的事件对象就会传递给该方法的参数e。 
4.ItemEvent类中的方法 :
              getSource()方法返回发生Itemevent事件的事件源外
              getItemSelectable()方法返回发生Itemevent事件的事件源。 
---------------------------------------------------------------------------------------------------

DocumentEvent事件
---------------------------------------------------------------------------------------------------------------------
1.  DocumentEvent事件源 :
                文本区所维护的文档能触发DocumentEvent事件  
2. 注册监视器:DocumentListener作为监视器
                事件源.addDucumentListener(DocumentListener listen)
                      将实现DocumentListener接口的类的实例注册为事件源的监视器。 
3. DocumentListener接口:重写接口中的方法作为事件处理
    DocumentListener接口在javax.swing.event包中,该接口中有三个方法:
          public void changedUpdate(DocumentEvent e)
          public void removeUpdate(DocumentEvent e)
          public void insertUpdate(DocumentEvent e)
----------------------------------------------------------------------------------------------------------------------

MouseEvent事件_1
-----------------------------------------------------------------------------------------------------------------------
1. 事件源:
        任何组件上都可以发生鼠标事件,如:鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发鼠标事件,
                 即导致MouseEvent类自动创建一个事件对象。 
2.使用MouseListener接口可以处理以下5种操作触发的鼠标事件
            事件源.addMouseListener(MouseListener listener)。 
                  在事件源上按下鼠标键、在事件源上释放鼠标键、在事件源上击鼠标键、鼠标进入事件源、鼠标退出事件源。
           注册监视器:MouseListener接口作为监视器
3. MouseListener接口中有如下方法:重写方法作为事件源的处理 
   mousePressed(MouseEvent) 负责处理在组件上按下鼠标键触发的鼠标事件
   mouseReleased(MouseEvent) 负责处理在组件上释放鼠标键触发的鼠标事件
   mouseEntered(MouseEvent) 负责处理鼠标进入组件触发的鼠标事件
   mouseExited(MouseEvent) 负责处理鼠标离开组件触发的鼠标事件
   mouseClicked(MouseEvent) 负责处理在组件上单击鼠标键触发的鼠标事件
4. MouseEvent 中有下列几个重要的方法:
         getX() 获取鼠标指针在事件源坐标系中的x-坐标。
         getY() 获取鼠标指针在事件源坐标系中的y-坐标。
        getModifiers() 获取鼠标的左键或右键。
         getClickCount() 获取鼠标被单击的次数。
          getSource() 获取发生鼠标事件的事件源。

5. MouseMotionListener接口
                 可以处理以下两种操作触发的鼠标事件,  在事件源上拖动鼠标、在事件源上移动鼠标。
          事件源注册监视器的方法是:
                    事件源.addMouseMotionListener(MouseMotionListener listener)。 
    MouseMotionListener接口中有如下方法:
                mouseDragged(MouseEvent)  负责处理拖动鼠标触发的鼠标事件。
                mouseMoved(MouseEvent)  负责处理移动鼠标触发的鼠标事件。
------------------------------------------------------------------------------------------------------------------------------

焦点事件
-----------------------------------------------------------------------------------------------
1.焦点事件源 :组件可以触发焦点事件。 
 2.注册监视器:组件可以使用
    addFocusListener(FocusListener listener)
     注册焦点事件监视器。 
 3.FocusListener接口 :
        创建监视器的类必须要实现FocusListener接口,该接口有两个方法:
      public void focusGained(FocusEvent e)
      public void focusLost(FocusEvent e)
        当发生FocusEvent事件时,监视器调用类实现的接口中的相应方法。
 4.组件也可调用
        public boolean requestFocusInWindow()
         方法可以获得输入焦点。 
--------------------------------------------------------------------------------------------------------------

键盘事件
--------------------------------------------------------------------------------------------------
1. 事件源:
            当一个组件处于激活状态时,敲击键盘上一个键就导致这个组件触发键盘事件。
2.某个组件使用addKeyListener方法注册监视器。
3.接口KeyListener中有如下方法:
     public void keyPressed(KeyEvent e),
     public void keyTyped(KeyEvent e),
     public void KeyReleased(KeyEvent e)  
4.(KeyEvent 相关方法:
   public int getKeyCode()判断哪个键被按下、敲击或释放,返回一个键码值 。      
   getKeyChar()判断哪个键被按下、敲击或释放,返回键上的字符。
-------------------------------------------------------------------------------------------------------

窗口事件
-------------------------------------------------------------------------------------
WindowListener接口. 
  (1)  public void windowActivated(WindowEvent e)  当窗口从非激活状态到激活时,窗口的监视器调用该方法。
(2) public void windowDeactivated(WindowEvent e)  当窗口激活状态到非激活状态时,窗口的监视器调用该方法。
(3) public void windowClosing(WindowEvent e)  当窗口正在被关闭时,窗口的监视器调用该方法。
(4) public void windowClosed(WindowEvent e)  当窗口关闭后,窗口的监视器调用该方法。
(5) public void windowIconified(WindowEvent e)  当窗口图标化时,窗口的监视器调用该方法。
(6) public void windowDeiconified(WindowEvent e)  当窗口撤消图标化时,窗口的监视器调用该方法。
(7) public void windowOpened(WindowEvent e)  当窗口打开时,窗口的监视器调用该方法。
--------------------------------------------------------------------------------------------------------

适配器
------------------------------------------------------------------------------------------------------------------------
每个具有不止一个方法的AWT监听器接口都有一个实现了它的所有方法,但却不做任何工作的适配器类。
适配器可以代替接口来处理事件,当Java提供处理事件的接口中多于一个方法时,Java相应地就提供一个适配器类,
比如WindowAdapter类。适配器已经实现了相应的接口,例如WindowAdapter类实现了WindowListener接口。
因此,可以使用WindowAdapte的子类创建的对象做监视器,在子类中重写所需要的接口方法即可。 

WindowAdapter适配器 .
ComponentAdapter
ContainerAdapter
FocusAdapter
KeyAdapter
MouseAdapter
MouseMotio**pter
WindowAdapter


===========================================
匿名类实例或窗口做监视器

匿名类的方便之处是匿名类的外嵌类的成员变量在匿名类中仍然有效,当发生事件时,监视器就比较容易操作事件源所在的外嵌类中的成员.
当事件的处理比较简单、系统也不复杂时,使用匿名类做监视器是一个不错的选择。
让事件源所在的类的实例作为监视器,能让事件的处理比较方便,这是因为,监视器可以方便的操作事件源所在的类中的其他成员。
当事件的处理比较简单,系统也不复杂时,让事件源所在的类的实例作为监视器是一个不错的选择。

===================================

事件总结
-------------------------------------------------------------------------------------------------------
1.授权模式
   Java的事件处理是基于授权模式,即事件源调用调用方法将某个对象注册为自己的监视器。
2.接口回调 
   addXXXListener(XXXListener listener)方法中的参数是一个接口,listener可以引用任何实现了该接口的类所创建的对象,
   当事件源发生事件时,接口listener立刻回调被类实现的接口中的某个方法。
3.方法绑定 
   当事件源触发事件发生后,监视器准确知道去调用哪个方法。
4.保持松耦合 
   当事件源触发事件发生后,系统知道某个方法会被执行,但无须关心到底是哪个对象去调用了这个方法,
     因为任何实现接口的类的实例(做为监视器)都可以调用这个方法来处理事件。    
===========================================================

=========================================

Java绘图机制
---------------------------------------------------------------
Component类有一个方法public void paint(Graphics g),程序可以在其子类中重写这个方法。
当程序运行时,java运行环境会用Graphicd2D(Graphics的一个子类)将参数g实例化,对象g就可以在重写paint方法的组件上内绘制图形、图像等 .
Graphics2D的“画笔”分别使用draw和fill方法来绘制和填充一个图形。
组件都是矩形形状,组件本身有一个默认的坐标系,组件的左上角的坐标值是(0,0)。

java.awt.geom
直线 
          Line2D.Double(double x1, double y1, double x2, double y2)

矩形
Rectangle2D.Double(double x, double y, double w, double h)

圆角矩形
RoundRectangle2D.Double(double x, double y, double w, double h);

椭圆
Ellipse2D.Double(double x, double y double w, double h);

圆弧
Arc2D.Double(double x, double y, double w, double h, double start, double extent, int type)
        x, y, w, h-----------椭圆位置大小
        start, -------------圆弧其实位置,单位:度
        extent-----------划过的度的弧。单位:度。正值:逆时针;负值:顺时针。
        type ---------------Arc2D.OPEN          Arc2D.CHORD                   Arc2D.PIE
文本
         g.drawString(s, x, y)

二次曲线
三次曲线
多边形

-----------------------------------------------------
有时需要平移、缩放或旋转一个图形。可以使用AffineTransform类来实现对图形的这些操作。例如: 
AffineTransform trans=new AffineTransform(); 
将图形沿顺时针或逆时针以(x,y)为轴点旋转number个弧度 :
trans.rotate(60.0*3.1415927/180,100,100); 

translate(double a, double b) -----------------------移动
              
scale(double a, double b)  ------------放缩
rotate(double number, double x, double y)-------------------------旋转
                 x,y --------旋转圆心
                 number--------旋转弧度

g_2d.setTransform(trans);

-------------------------------------------------
两个图形进行布尔运算运算之前,必须分别用这两个图形创建两个Area区域对象,例如:
    Area a1 = new Area(T1);
    Area a2 = new Area(T2);
a1就是图形T1所围成的区域;a2就是T2所围成的区域。那么,a1调用add方法:
   a1.add(a2); -------------  或
之后,a1就变成a1和a2经过布尔“或”运算后的图形区域。可以用Graphics2D对象g来绘制或填充一个Area对象(区域):
  g.draw(a1);
  g.fill(a1);

   a1.intersect(a2); ---------与
   a1.exclusiveOr(a2) ----------------异或
   a1.subtract(a2) ------------差。

---------------------------------------------------
1.加载图像
组件调用getToolkit()方法可以返回这个对象的引用。Tollkit类的对象调用方法   Image getImage(String fileNme)
或      Image getImage(File file)。
可以返回一个Image对象,该对象封装着参数file(或参数fileName)指定的图像文件。

2.绘制图像 
public boolean drawImage(Image img,int x,int y,ImageObserver observer);
    参数img是被绘制的Image对象,x、y是要绘制指定图像的矩形的左上角所处的位置,observer是加载图像时的图像观察器 。

-----------------------------------------------------------

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。