首頁(yè)技術(shù)文章正文

Swing有幾種事件?Swing常用事件講解

更新時(shí)間:2021-04-29 來(lái)源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif


在Swing中,提供了豐富的事件,這些事件大致可以分為窗體事件(WindowEvent)、鼠標(biāo)事件(MouseEvent)、鍵盤(pán)事件(KeyEvent)、動(dòng)作事件(ActionEvent)等。接下來(lái),本節(jié)中將對(duì)這些常用事件進(jìn)行詳細(xì)地講解。

1.窗體事件

大部分GUI應(yīng)用程序都需要使用Window窗體對(duì)象作為最外層的容器,可以說(shuō)窗體對(duì)象是所有GUI應(yīng)用程序的基礎(chǔ),應(yīng)用程序中通常都是將其他組件直接或者間接地添加到窗體中。

當(dāng)對(duì)窗體進(jìn)行操作時(shí),例如窗體的打開(kāi)、關(guān)閉、激活、停用等,這些動(dòng)作都屬于窗體事件,Java中提供了一個(gè)WindowEvent類用于表示窗體事件。在應(yīng)用程序中,當(dāng)對(duì)窗體事件進(jìn)行處理時(shí),首先需要定義一個(gè)實(shí)現(xiàn)了WindowListener接口的類作為窗體監(jiān)聽(tīng)器,然后通過(guò)addWindowListener()方法將窗體對(duì)象與窗體監(jiān)聽(tīng)器進(jìn)行綁定。

接下來(lái)通過(guò)一個(gè)案例來(lái)實(shí)現(xiàn)對(duì)窗體事件的監(jiān)聽(tīng),如文件1所示。

文件1 Example07.java

     import java.awt.event.*;
     import javax.swing.*;
     public class Example07 {
         private static void createAndShowGUI() {
             JFrame f = new JFrame("WindowEvent");
             f.setSize(400, 300);
             f.setLocation(300, 200);
             f.setVisible(true);
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             // 使用內(nèi)部類創(chuàng)建WindowListener實(shí)例對(duì)象,監(jiān)聽(tīng)窗體事件
             f.addWindowListener(new WindowListener() {
                 public void windowOpened(WindowEvent e) {
                     System.out.println("windowOpened---窗體打開(kāi)事件");
                 }
                 public void windowIconified(WindowEvent e) {
                     System.out.println("windowIconified---窗體圖標(biāo)化事件");
                 }
                 public void windowDeiconified(WindowEvent e) {
                   System.out.println("windowDeiconified---窗體取消圖標(biāo)化事件");
                 }
                 public void windowDeactivated(WindowEvent e) {
                     System.out.println("windowDeactivated---窗體停用事件");
                 }
                 public void windowClosing(WindowEvent e) {
                     System.out.println("windowClosing---窗體正在關(guān)閉事件");
                 }
                 public void windowClosed(WindowEvent e) {
                     System.out.println("windowClosed---窗體關(guān)閉事件");
                 }
                 public void windowActivated(WindowEvent e) {
                     System.out.println("windowActivated---窗體激活事件");
                 }
             });
         }
         public static void main(String[] args) {
             // 使用SwingUtilities工具類調(diào)用createAndShowGUI()方法并顯示GUI程序
             SwingUtilities.invokeLater(Example07::createAndShowGUI);
         }
     }
運(yùn)行結(jié)果如圖1所示。

1619692314203_41.png

圖1 運(yùn)行結(jié)果

文件1中,通過(guò)WindowListener對(duì)操作窗口的窗體事件進(jìn)行監(jiān)聽(tīng),當(dāng)接收到特定的動(dòng)作后,就將所觸發(fā)事件的名稱打印出來(lái)。接著對(duì)圖8-11所示的窗體事件源進(jìn)行事件操作,分別執(zhí)行最小化、單擊任務(wù)欄圖標(biāo)、單擊關(guān)閉按鈕時(shí),窗口事件監(jiān)聽(tīng)器就會(huì)對(duì)相應(yīng)的操作進(jìn)行監(jiān)聽(tīng)并響應(yīng),結(jié)果如圖2所示。

1619692322619_42.png

圖2 運(yùn)行結(jié)果


2.鼠標(biāo)事件

在圖形用戶界面中,用戶會(huì)經(jīng)常使用鼠標(biāo)來(lái)進(jìn)行選擇、切換界面等操作,這些操作被定義為鼠標(biāo)事件,其中包括鼠標(biāo)按下、鼠標(biāo)松開(kāi)、鼠標(biāo)單擊等。Java中提供了一個(gè)MouseEvent類用于表示鼠標(biāo)事件,幾乎所有的組件都可以產(chǎn)生鼠標(biāo)事件。處理鼠標(biāo)事件時(shí),首先需要通過(guò)實(shí)現(xiàn)MouseListener接口定義監(jiān)聽(tīng)器(也可以通過(guò)繼承適配器MouseAdapter類來(lái)實(shí)現(xiàn)),然后調(diào)用addMouseListener()方法將監(jiān)聽(tīng)器綁定到事件源對(duì)象。

接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)如何監(jiān)聽(tīng)鼠標(biāo)事件,如文件2所示。

文件2 Example08.java

     import java.awt.*;
     import java.awt.event.*;
     import javax.swing.*;
     public class Example08 {
         private static void createAndShowGUI() {
             JFrame f = new JFrame("MouseEvent");
             f.setLayout(new FlowLayout());       // 為窗口設(shè)置布局
             f.setSize(300, 200);
             f.setLocation(300, 200);
             f.setVisible(true);
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             JButton but = new JButton("Button");// 創(chuàng)建按鈕對(duì)象
             f.add(but);                              // 在窗口添加按鈕組件
             // 為按鈕添加鼠標(biāo)事件監(jiān)聽(tīng)器
             but.addMouseListener(new MouseListener() {
                 public void mouseReleased(MouseEvent e) {
                     System.out.println("mouseReleased-鼠標(biāo)放開(kāi)事件");
                 }
                 public void mousePressed(MouseEvent e) {
                     System.out.println("mousePressed-鼠標(biāo)按下事件");
                 }
                 public void mouseExited(MouseEvent e) {
                     System.out.println("mouseExited—鼠標(biāo)移出按鈕區(qū)域事件");
                 }
                 public void mouseEntered(MouseEvent e) {
                     System.out.println("mouseEntered—鼠標(biāo)進(jìn)入按鈕區(qū)域事件");
                 }
                 public void mouseClicked(MouseEvent e) {
                     System.out.println("mouseClicked-鼠標(biāo)完成單擊事件");
                 }
             });
         }
         public static void main(String[] args) {
             // 使用SwingUtilities工具類調(diào)用createAndShowGUI()方法并顯示GUI程序
             SwingUtilities.invokeLater(Example08::createAndShowGUI);
         }
     }

運(yùn)行結(jié)果如圖3所示。

1619692331503_43.png

圖3 運(yùn)行結(jié)果

在圖3中,用鼠標(biāo)對(duì)窗口上的按鈕進(jìn)行操作,先把鼠標(biāo)移進(jìn)按鈕區(qū)域,接著單擊按鈕然后釋放,再移出按鈕區(qū)域,控制臺(tái)的輸出信息如圖4所示。

1619692337320_44.png

圖4 運(yùn)行結(jié)果

從圖4可以看出,當(dāng)鼠標(biāo)對(duì)按鈕作出了相應(yīng)的動(dòng)作之后,監(jiān)聽(tīng)器獲取到相應(yīng)的事件對(duì)象,從而打印出動(dòng)作所對(duì)應(yīng)的事件名稱。

讀者可能會(huì)問(wèn),鼠標(biāo)的操作分為左鍵單雙擊和右鍵單雙擊,而且還有滾輪動(dòng)作。上面只給出這些事件的處理,能滿足實(shí)際需求嗎?答案是肯定的,MouseEvent類中定義了很多常量來(lái)識(shí)別鼠標(biāo)動(dòng)作。如下面的代碼所示:

public void mouseClicked(MouseEvent e) {
    if(e.getButton()==MouseEvent.BUTTON1){
        System.out.println("鼠標(biāo)左擊事件");
    }    
    if(e.getButton()==MouseEvent.BUTTON3){
        System.out.println("鼠標(biāo)右擊事件");
    }
    if(e.getButton()==MouseEvent.BUTTON2){
        System.out.println("鼠標(biāo)中鍵單擊事件");
    }
}

從上面的代碼可以看出,MouseEvent類中針對(duì)鼠標(biāo)的按鍵都定義了對(duì)應(yīng)的常量,可以通過(guò)MouseEvent對(duì)象的getButton()方法獲取被操作按鍵的鍵值,從而判斷是哪個(gè)按鍵的操作。另外,鼠標(biāo)的單擊次數(shù)也可以通過(guò)MouseEvent對(duì)象的getClickCount()方法獲取到。因此,在鼠標(biāo)事件中,可以根據(jù)不同的操作,做出相應(yīng)的處理。

3.鍵盤(pán)事件

鍵盤(pán)操作也是最常用的用戶交互方式,例如鍵盤(pán)按下、釋放等,這些操作被定義為鍵盤(pán)事件。Java中提供了一個(gè)KeyEvent類表示鍵盤(pán)事件,處理KeyEvent事件的監(jiān)聽(tīng)器對(duì)象需要實(shí)現(xiàn)KeyListener接口或者繼承KeyAdapter類,然后調(diào)用addKeyListener()方法將監(jiān)聽(tīng)器綁定到事件源對(duì)象。

接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)如何監(jiān)聽(tīng)鍵盤(pán)事件,如文件3所示。

文件3 Example09.java

     import java.awt.*;
     import java.awt.event.*;
     import javax.swing.*;
     public class Example09 {
         private static void createAndShowGUI() {
             JFrame f = new JFrame("KeyEvent");
             f.setLayout(new FlowLayout());
             f.setSize(400, 300);
             f.setLocation(300, 200);
            JTextField tf = new JTextField(30); // 創(chuàng)建文本框?qū)ο?             f.add(tf);                               // 在窗口中添加文本框組件
             f.setVisible(true);
             f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              // 為文本框添加鍵盤(pán)事件監(jiān)聽(tīng)器
             tf.addKeyListener(new KeyAdapter() {
                 public void keyPressed(KeyEvent e) {
                     // 獲取對(duì)應(yīng)的鍵盤(pán)字符
                     char keyChar = e.getKeyChar();
                     // 獲取對(duì)應(yīng)的鍵盤(pán)字符代碼
                     int keyCode = e.getKeyCode();
                     System.out.print("鍵盤(pán)按下的字符內(nèi)容為:" + keyChar+" ");
                     System.out.println("鍵盤(pán)按下的字符代碼為:" + keyCode);
                 }
             });
         }
         public static void main(String[] args) {
             // 使用SwingUtilities工具類調(diào)用createAndShowGUI()方法并顯示GUI程序
             SwingUtilities.invokeLater(Example09::createAndShowGUI);
         }
     }

運(yùn)行結(jié)果如圖5所示。

1619692362702_45.png

圖5 運(yùn)行結(jié)果

文件3中,用到JTextComponent類的子類JTextField,它只允許編輯單行文本。當(dāng)在圖8-15中的文件框中鍵入字符時(shí),便觸發(fā)了鍵盤(pán)事件,會(huì)執(zhí)行重寫(xiě)的keyPressed()方法。這時(shí),可以通過(guò)KeyEvent類的getKeyChar()方法獲取鍵盤(pán)鍵入的字符,通過(guò)getKeyCode()方法可以獲取輸入字符對(duì)應(yīng)的整數(shù)值。在圖5所示的窗口中,依次輸入鍵盤(pán)上的a、s、1字符時(shí),控制臺(tái)將按鍵對(duì)應(yīng)的名稱和鍵值(keyCode)打印了出來(lái),如圖6所示。

1619692372894_46.png

圖6 運(yùn)行結(jié)果


4.動(dòng)作事件

動(dòng)作事件與前面三種事件有所不同,它不代表某類事件,只是表示一個(gè)動(dòng)作發(fā)生了。例如,在關(guān)閉一個(gè)文件時(shí),可以通過(guò)鍵盤(pán)關(guān)閉,也可以通過(guò)鼠標(biāo)關(guān)閉。在這里讀者不需要關(guān)心使用哪種方式對(duì)文件進(jìn)行關(guān)閉,只要是對(duì)關(guān)閉按鈕進(jìn)行操作,即觸發(fā)了動(dòng)作事件。

在Java中,動(dòng)作事件用ActionEvent類表示,處理ActionEvent事件的監(jiān)聽(tīng)器對(duì)象需要實(shí)現(xiàn)ActionListener接口。監(jiān)聽(tīng)器對(duì)象在監(jiān)聽(tīng)動(dòng)作時(shí),不會(huì)像鼠標(biāo)事件一樣處理鼠標(biāo)的移動(dòng)和單擊的細(xì)節(jié),而是去處理類似于“按鈕按下”這樣“有意義”的事件。





猜你喜歡:

Java swing是什么?有什么作用?

Swing頂級(jí)容器:JFrame和JDialog介紹

Java Swing 布局管理器使用教程    
黑馬程序員高級(jí)java工程師培訓(xùn)

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!