gui事件處理機(jī)制

      網(wǎng)友投稿 936 2022-05-29

      主要內(nèi)容:

      Java事件處理機(jī)制

      常見事件及處理接口

      Java繪圖機(jī)制

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

      Java事件處理機(jī)制

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

      簡介:

      Java事件處理機(jī)制是一種基于授權(quán)的事件處理機(jī)制。

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

      事件處理中的主要概念:

      事件源,能夠產(chǎn)生事件的對(duì)象都可以成為事件源 .

      監(jiān)視器,負(fù)責(zé)監(jiān)視事件源的對(duì)象,當(dāng)事件源產(chǎn)生事件時(shí),監(jiān)視器將調(diào)用方法對(duì)事件進(jìn)行處理。

      事件源通過調(diào)用相應(yīng)的方法將某個(gè)對(duì)象注冊為自己的監(jiān)視器。

      對(duì)于文本框,這個(gè)方法是:addActionListener(監(jiān)視器);

      java語言中監(jiān)視器都是使用接口來實(shí)現(xiàn)的。

      事件源注冊監(jiān)視器之后,相應(yīng)的操作就會(huì)導(dǎo)致相應(yīng)的事件的發(fā)生,并通知監(jiān)視器,監(jiān)視器就會(huì)作出相應(yīng)的處理。

      事件處理接口,接口中定義了處理事件的方法。

      監(jiān)視器負(fù)責(zé)處理事件源發(fā)生的事件。

      監(jiān)視器是一個(gè)對(duì)象,為了處理事件源發(fā)生的事件,監(jiān)視器這個(gè)對(duì)象會(huì)自動(dòng)調(diào)用接口中一個(gè)方法來處理事件。

      Java規(guī)定:為了讓監(jiān)視器這個(gè)對(duì)象能對(duì)事件源發(fā)生的事件進(jìn)行處理,

      創(chuàng)建該監(jiān)視器對(duì)象的類必須聲明實(shí)現(xiàn)相應(yīng)的接口,那么當(dāng)事件源發(fā)生事件時(shí),監(jiān)視器就自動(dòng)調(diào)用被類重寫的某個(gè)接口方法。

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

      事件處理步驟:

      1.寫一個(gè)監(jiān)視器類

      class Pliceman implements XXXListener

      {

      接口方法(XXXEvent e)

      {

      //.......

      }

      }

      2.創(chuàng)建事件源、監(jiān)視器對(duì)象

      3.事件源注冊監(jiān)視器

      事件源.addXXXListener(監(jiān)視器);

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

      常見事件及處理接口

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

      ActionEvent事件 ? ?***

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

      1 ActionEvent事件源 :

      文本框、按紐、菜單項(xiàng)、密碼框和單選按紐都可以觸發(fā)ActionEvent事件,即都可以成為ActionEvent事件的事件源。

      2.注冊監(jiān)視器: ActionListener接口作為監(jiān)視器

      事件源.addActionListener(ActionListener listen)

      將實(shí)現(xiàn)ActionListener接口的類的實(shí)例注冊為事件源的監(jiān)視器。

      3.ActionListener接口:重寫接口中的方法作為事件處理。

      ActionListener接口在java.awt.event包中,該接口中只有一個(gè)方法:

      public void actionPerformed(ActinEvent e) ;

      事件源觸發(fā)ActionEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ActionEvent事件,然后調(diào)用接口中的這個(gè)方法對(duì)發(fā)生的事件作出處理。

      ActionEvent類事先創(chuàng)建的事件對(duì)象就會(huì)傳遞給該方法的參數(shù)e。

      4.ActionEvent類中的方法:下面的方法能夠獲取發(fā)生動(dòng)作的事件源。

      public Object getSource() --------- 調(diào)用該方法可以獲取發(fā)生ActionEvent事件的事件源對(duì)象的引用。

      public String getActionCommand() ?--------- ?調(diào)用該方法可以獲取發(fā)生ActionEvent事件時(shí),和該事件相關(guān)的一個(gè)命令字符串。

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

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

      帶事件處理的GUI程序總結(jié):

      通常有3各類:

      監(jiān)視器類

      public class Pliceman implements ActionListener {

      //取數(shù)組的組件

      //顯示數(shù)據(jù)的組件

      //設(shè)置取數(shù)據(jù)組件的方法

      //設(shè)置顯示數(shù)據(jù)組件的方法

      //接口中的方法

      public void actionPerformed(ActionEvent e) {

      //取得數(shù)據(jù)

      //處理數(shù)據(jù)

      //顯示數(shù)據(jù)

      }

      }

      窗口類

      pulic MainFrame extends JFrame {

      //組件

      //監(jiān)視器

      public MainFrame() {

      init();

      initEvent();

      //設(shè)置窗口的屬性

      }

      void init() {

      //設(shè)置布局

      //創(chuàng)建組件

      //添加組件

      }

      void initEvent() {

      //創(chuàng)建監(jiān)視器

      //設(shè)置監(jiān)視器的屬性

      //事件源注冊監(jiān)視器

      }

      }

      主類

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

      ItemEvent事件

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

      1.ItemEvent事件源 :

      選擇框、下拉列表都可以觸發(fā)ItemEvent事件。

      2.注冊監(jiān)視器:ItemListener接口作為監(jiān)視器

      事件源.addItemListener(ItemListener listen)

      將實(shí)現(xiàn)ItemListener接口的類的實(shí)例注冊為事件源的監(jiān)視器。

      3.ItemListener接口:重寫方法作為事件處理

      ItemListener接口在java.awt.event包中,該接口中只有一個(gè)方法

      public void itemStateChanged(ItemEvent e)

      事件源觸發(fā)ItemEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ItemEvent事件,

      然后調(diào)用接口中的itemStateChanged(ItemEvent ?e)方法對(duì)發(fā)生的事件作出處理。

      ItemEvent類事先創(chuàng)建的事件對(duì)象就會(huì)傳遞給該方法的參數(shù)e。

      4.ItemEvent類中的方法 :

      getSource()方法返回發(fā)生Itemevent事件的事件源外

      getItemSelectable()方法返回發(fā)生Itemevent事件的事件源。

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

      DocumentEvent事件

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

      gui事件處理機(jī)制

      1. ?DocumentEvent事件源 :

      文本區(qū)所維護(hù)的文檔能觸發(fā)DocumentEvent事件

      2. 注冊監(jiān)視器:DocumentListener作為監(jiān)視器

      事件源.addDucumentListener(DocumentListener listen)

      將實(shí)現(xiàn)DocumentListener接口的類的實(shí)例注冊為事件源的監(jiān)視器。

      3. DocumentListener接口:重寫接口中的方法作為事件處理

      DocumentListener接口在javax.swing.event包中,該接口中有三個(gè)方法:

      public void changedUpdate(DocumentEvent e)

      public void removeUpdate(DocumentEvent e)

      public void insertUpdate(DocumentEvent e)

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

      MouseEvent事件_1

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

      1. 事件源:

      任何組件上都可以發(fā)生鼠標(biāo)事件,如:鼠標(biāo)進(jìn)入組件、退出組件、在組件上方單擊鼠標(biāo)、拖動(dòng)鼠標(biāo)等都觸發(fā)鼠標(biāo)事件,

      即導(dǎo)致MouseEvent類自動(dòng)創(chuàng)建一個(gè)事件對(duì)象。

      2.使用MouseListener接口可以處理以下5種操作觸發(fā)的鼠標(biāo)事件

      事件源.addMouseListener(MouseListener listener)。

      在事件源上按下鼠標(biāo)鍵、在事件源上釋放鼠標(biāo)鍵、在事件源上擊鼠標(biāo)鍵、鼠標(biāo)進(jìn)入事件源、鼠標(biāo)退出事件源。

      注冊監(jiān)視器:MouseListener接口作為監(jiān)視器

      3. MouseListener接口中有如下方法:重寫方法作為事件源的處理

      mousePressed(MouseEvent) 負(fù)責(zé)處理在組件上按下鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件

      mouseReleased(MouseEvent) 負(fù)責(zé)處理在組件上釋放鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件

      mouseEntered(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)進(jìn)入組件觸發(fā)的鼠標(biāo)事件

      mouseExited(MouseEvent) 負(fù)責(zé)處理鼠標(biāo)離開組件觸發(fā)的鼠標(biāo)事件

      mouseClicked(MouseEvent) 負(fù)責(zé)處理在組件上單擊鼠標(biāo)鍵觸發(fā)的鼠標(biāo)事件

      4. MouseEvent 中有下列幾個(gè)重要的方法:

      getX() 獲取鼠標(biāo)指針在事件源坐標(biāo)系中的x-坐標(biāo)。

      getY() 獲取鼠標(biāo)指針在事件源坐標(biāo)系中的y-坐標(biāo)。

      getModifiers() 獲取鼠標(biāo)的左鍵或右鍵。

      getClickCount() 獲取鼠標(biāo)被單擊的次數(shù)。

      getSource() 獲取發(fā)生鼠標(biāo)事件的事件源。

      5. MouseMotionListener接口

      可以處理以下兩種操作觸發(fā)的鼠標(biāo)事件, ?在事件源上拖動(dòng)鼠標(biāo)、在事件源上移動(dòng)鼠標(biāo)。

      事件源注冊監(jiān)視器的方法是:

      事件源.addMouseMotionListener(MouseMotionListener listener)。

      MouseMotionListener接口中有如下方法:

      mouseDragged(MouseEvent) ?負(fù)責(zé)處理拖動(dòng)鼠標(biāo)觸發(fā)的鼠標(biāo)事件。

      mouseMoved(MouseEvent) ?負(fù)責(zé)處理移動(dòng)鼠標(biāo)觸發(fā)的鼠標(biāo)事件。

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

      焦點(diǎn)事件

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

      1.焦點(diǎn)事件源 :組件可以觸發(fā)焦點(diǎn)事件。

      2.注冊監(jiān)視器:組件可以使用

      addFocusListener(FocusListener listener)

      注冊焦點(diǎn)事件監(jiān)視器。

      3.FocusListener接口 :

      創(chuàng)建監(jiān)視器的類必須要實(shí)現(xiàn)FocusListener接口,該接口有兩個(gè)方法:

      public void focusGained(FocusEvent e)

      public void focusLost(FocusEvent e)

      當(dāng)發(fā)生FocusEvent事件時(shí),監(jiān)視器調(diào)用類實(shí)現(xiàn)的接口中的相應(yīng)方法。

      4.組件也可調(diào)用

      public boolean requestFocusInWindow()

      方法可以獲得輸入焦點(diǎn)。

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

      鍵盤事件

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

      1. 事件源:

      當(dāng)一個(gè)組件處于激活狀態(tài)時(shí),敲擊鍵盤上一個(gè)鍵就導(dǎo)致這個(gè)組件觸發(fā)鍵盤事件。

      2.某個(gè)組件使用addKeyListener方法注冊監(jiān)視器。

      3.接口KeyListener中有如下方法:

      public void keyPressed(KeyEvent e),

      public void keyTyped(KeyEvent e),

      public void KeyReleased(KeyEvent e)

      4.(KeyEvent 相關(guān)方法:

      public int getKeyCode()判斷哪個(gè)鍵被按下、敲擊或釋放,返回一個(gè)鍵碼值 。

      getKeyChar()判斷哪個(gè)鍵被按下、敲擊或釋放,返回鍵上的字符。

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

      窗口事件

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

      WindowListener接口.

      (1) ?public void windowActivated(WindowEvent e) ?當(dāng)窗口從非激活狀態(tài)到激活時(shí),窗口的監(jiān)視器調(diào)用該方法。

      (2) public void windowDeactivated(WindowEvent e) ?當(dāng)窗口激活狀態(tài)到非激活狀態(tài)時(shí),窗口的監(jiān)視器調(diào)用該方法。

      (3) public void windowClosing(WindowEvent e) ?當(dāng)窗口正在被關(guān)閉時(shí),窗口的監(jiān)視器調(diào)用該方法。

      (4) public void windowClosed(WindowEvent e) ?當(dāng)窗口關(guān)閉后,窗口的監(jiān)視器調(diào)用該方法。

      (5) public void windowIconified(WindowEvent e) ?當(dāng)窗口圖標(biāo)化時(shí),窗口的監(jiān)視器調(diào)用該方法。

      (6) public void windowDeiconified(WindowEvent e) ?當(dāng)窗口撤消圖標(biāo)化時(shí),窗口的監(jiān)視器調(diào)用該方法。

      (7) public void windowOpened(WindowEvent e) ?當(dāng)窗口打開時(shí),窗口的監(jiān)視器調(diào)用該方法。

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

      適配器

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

      每個(gè)具有不止一個(gè)方法的AWT-接口都有一個(gè)實(shí)現(xiàn)了它的所有方法,但卻不做任何工作的適配器類。

      適配器可以代替接口來處理事件,當(dāng)Java提供處理事件的接口中多于一個(gè)方法時(shí),Java相應(yīng)地就提供一個(gè)適配器類,

      比如WindowAdapter類。適配器已經(jīng)實(shí)現(xiàn)了相應(yīng)的接口,例如WindowAdapter類實(shí)現(xiàn)了WindowListener接口。

      因此,可以使用WindowAdapte的子類創(chuàng)建的對(duì)象做監(jiān)視器,在子類中重寫所需要的接口方法即可。

      WindowAdapter適配器 .

      ComponentAdapter

      ContainerAdapter

      FocusAdapter

      KeyAdapter

      MouseAdapter

      MouseMotio**pter

      WindowAdapter

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

      匿名類實(shí)例或窗口做監(jiān)視器

      匿名類的方便之處是匿名類的外嵌類的成員變量在匿名類中仍然有效,當(dāng)發(fā)生事件時(shí),監(jiān)視器就比較容易操作事件源所在的外嵌類中的成員.

      當(dāng)事件的處理比較簡單、系統(tǒng)也不復(fù)雜時(shí),使用匿名類做監(jiān)視器是一個(gè)不錯(cuò)的選擇。

      讓事件源所在的類的實(shí)例作為監(jiān)視器,能讓事件的處理比較方便,這是因?yàn)椋O(jiān)視器可以方便的操作事件源所在的類中的其他成員。

      當(dāng)事件的處理比較簡單,系統(tǒng)也不復(fù)雜時(shí),讓事件源所在的類的實(shí)例作為監(jiān)視器是一個(gè)不錯(cuò)的選擇。

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

      事件總結(jié)

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

      1.授權(quán)模式

      Java的事件處理是基于授權(quán)模式,即事件源調(diào)用調(diào)用方法將某個(gè)對(duì)象注冊為自己的監(jiān)視器。

      2.接口回調(diào)

      addXXXListener(XXXListener listener)方法中的參數(shù)是一個(gè)接口,listener可以引用任何實(shí)現(xiàn)了該接口的類所創(chuàng)建的對(duì)象,

      當(dāng)事件源發(fā)生事件時(shí),接口listener立刻回調(diào)被類實(shí)現(xiàn)的接口中的某個(gè)方法。

      3.方法綁定

      當(dāng)事件源觸發(fā)事件發(fā)生后,監(jiān)視器準(zhǔn)確知道去調(diào)用哪個(gè)方法。

      4.保持松耦合

      當(dāng)事件源觸發(fā)事件發(fā)生后,系統(tǒng)知道某個(gè)方法會(huì)被執(zhí)行,但無須關(guān)心到底是哪個(gè)對(duì)象去調(diào)用了這個(gè)方法,

      因?yàn)槿魏螌?shí)現(xiàn)接口的類的實(shí)例(做為監(jiān)視器)都可以調(diào)用這個(gè)方法來處理事件。

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

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

      Java繪圖機(jī)制

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

      Component類有一個(gè)方法public void paint(Graphics g),程序可以在其子類中重寫這個(gè)方法。

      當(dāng)程序運(yùn)行時(shí),java運(yùn)行環(huán)境會(huì)用Graphicd2D(Graphics的一個(gè)子類)將參數(shù)g實(shí)例化,對(duì)象g就可以在重寫paint方法的組件上內(nèi)繪制圖形、圖像等 .

      Graphics2D的“畫筆”分別使用draw和fill方法來繪制和填充一個(gè)圖形。

      組件都是矩形形狀,組件本身有一個(gè)默認(rèn)的坐標(biāo)系,組件的左上角的坐標(biāo)值是(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, -------------圓弧其實(shí)位置,單位:度

      extent-----------劃過的度的弧。單位:度。正值:逆時(shí)針;負(fù)值:順時(shí)針。

      type ---------------Arc2D.OPEN ? ? ? ? ?Arc2D.CHORD ? ? ? ? ? ? ? ? ? Arc2D.PIE

      文本

      g.drawString(s, x, y)

      二次曲線

      三次曲線

      多邊形

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

      有時(shí)需要平移、縮放或旋轉(zhuǎn)一個(gè)圖形。可以使用AffineTransform類來實(shí)現(xiàn)對(duì)圖形的這些操作。例如:

      AffineTransform trans=new AffineTransform();

      將圖形沿順時(shí)針或逆時(shí)針以(x,y)為軸點(diǎn)旋轉(zhuǎn)number個(gè)弧度 :

      trans.rotate(60.0*3.1415927/180,100,100);

      translate(double a, double b) -----------------------移動(dòng)

      scale(double a, double b) ?------------放縮

      rotate(double number, double x, double y)-------------------------旋轉(zhuǎn)

      x,y --------旋轉(zhuǎn)圓心

      number--------旋轉(zhuǎn)弧度

      g_2d.setTransform(trans);

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

      兩個(gè)圖形進(jìn)行布爾運(yùn)算運(yùn)算之前,必須分別用這兩個(gè)圖形創(chuàng)建兩個(gè)Area區(qū)域?qū)ο?,例如?/p>

      Area a1 = new Area(T1);

      Area a2 = new Area(T2);

      a1就是圖形T1所圍成的區(qū)域;a2就是T2所圍成的區(qū)域。那么,a1調(diào)用add方法:

      a1.add(a2); ------------- ?或

      之后,a1就變成a1和a2經(jīng)過布爾“或”運(yùn)算后的圖形區(qū)域??梢杂肎raphics2D對(duì)象g來繪制或填充一個(gè)Area對(duì)象(區(qū)域):

      g.draw(a1);

      g.fill(a1);

      a1.intersect(a2); ---------與

      a1.exclusiveOr(a2) ----------------異或

      a1.subtract(a2) ------------差。

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

      1.加載圖像

      組件調(diào)用getToolkit()方法可以返回這個(gè)對(duì)象的引用。Tollkit類的對(duì)象調(diào)用方法 ? Image getImage(String fileNme)

      或 ? ? ?Image getImage(File file)。

      可以返回一個(gè)Image對(duì)象,該對(duì)象封裝著參數(shù)file(或參數(shù)fileName)指定的圖像文件。

      2.繪制圖像

      public boolean drawImage(Image img,int x,int y,ImageObserver observer);

      參數(shù)img是被繪制的Image對(duì)象,x、y是要繪制指定圖像的矩形的左上角所處的位置,observer是加載圖像時(shí)的圖像觀察器 。

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

      Java

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:快手搶占“短視頻第一股”,宿華都有哪些底牌?
      下一篇:華為云企業(yè)級(jí)Redis揭秘第九期:高斯Redis與HBase對(duì)比優(yōu)勢
      相關(guān)文章
      亚洲国产模特在线播放| 亚洲一级片免费看| 色天使色婷婷在线影院亚洲| 亚洲国色天香视频| 久久久婷婷五月亚洲97号色| 亚洲AV无码久久寂寞少妇| 自拍偷自拍亚洲精品情侣| 亚洲国产精品一区二区第四页| 亚洲乱理伦片在线观看中字| 亚洲乱色熟女一区二区三区蜜臀| 亚洲欧洲日韩极速播放| 亚洲中文字幕无码爆乳app| 99亚偷拍自图区亚洲| 亚洲人成网男女大片在线播放| 亚洲av无码不卡久久| 国产AV旡码专区亚洲AV苍井空| 美女视频黄免费亚洲| 91在线亚洲综合在线| 亚洲 欧洲 自拍 另类 校园| 亚洲另类自拍丝袜第1页| 亚洲jjzzjjzz在线观看| 精品国产成人亚洲午夜福利| 亚洲午夜无码久久| 蜜芽亚洲av无码一区二区三区| 男人的天堂av亚洲一区2区| 亚洲А∨精品天堂在线| 亚洲av高清在线观看一区二区| 亚洲国产人成精品| 国产亚洲人成A在线V网站 | 亚洲第一永久在线观看| 亚洲欧洲日产国码www| youjizz亚洲| 亚洲Aⅴ在线无码播放毛片一线天| 久久久久亚洲国产AV麻豆 | 亚洲va中文字幕无码| 伊人亚洲综合青草青草久热| 亚洲VA中文字幕无码毛片| 亚洲美女中文字幕| 亚洲精品二三区伊人久久| 亚洲精品国产综合久久久久紧 | 亚洲精选在线观看|