教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Swing有幾種常用的事件處理方式?如何監(jiān)聽事件?

更新時間:2021年04月29日18時36分 來源:傳智教育 瀏覽次數(shù):

傳智教育-一樣的教育,不一樣的品質(zhì)

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

1.窗體事件

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

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

接下來通過一個案例來實(shí)現(xiàn)對窗體事件的監(jiān)聽,如文件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í)例對象,監(jiān)聽窗體事件
             f.addWindowListener(new WindowListener() {
                 public void windowOpened(WindowEvent e) {
                     System.out.println("windowOpened---窗體打開事件");
                 }
                 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中,通過WindowListener對操作窗口的窗體事件進(jìn)行監(jiān)聽,當(dāng)接收到特定的動作后,就將所觸發(fā)事件的名稱打印出來。接著對圖8-11所示的窗體事件源進(jìn)行事件操作,分別執(zhí)行最小化、單擊任務(wù)欄圖標(biāo)、單擊關(guān)閉按鈕時,窗口事件監(jiān)聽器就會對相應(yīng)的操作進(jìn)行監(jiān)聽并響應(yīng),結(jié)果如圖2所示。

1619692322619_42.png

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


2.鼠標(biāo)事件

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

接下來通過一個案例來學(xué)習(xí)如何監(jiān)聽鼠標(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)建按鈕對象
             f.add(but);                              // 在窗口添加按鈕組件
             // 為按鈕添加鼠標(biāo)事件監(jiān)聽器
             but.addMouseListener(new MouseListener() {
                 public void mouseReleased(MouseEvent e) {
                     System.out.println("mouseReleased-鼠標(biāo)放開事件");
                 }
                 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)對窗口上的按鈕進(jìn)行操作,先把鼠標(biāo)移進(jìn)按鈕區(qū)域,接著單擊按鈕然后釋放,再移出按鈕區(qū)域,控制臺的輸出信息如圖4所示。

1619692337320_44.png

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

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

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

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類中針對鼠標(biāo)的按鍵都定義了對應(yīng)的常量,可以通過MouseEvent對象的getButton()方法獲取被操作按鍵的鍵值,從而判斷是哪個按鍵的操作。另外,鼠標(biāo)的單擊次數(shù)也可以通過MouseEvent對象的getClickCount()方法獲取到。因此,在鼠標(biāo)事件中,可以根據(jù)不同的操作,做出相應(yīng)的處理。

3.鍵盤事件

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

接下來通過一個案例來學(xué)習(xí)如何監(jiā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);
              // 為文本框添加鍵盤事件監(jiān)聽器
             tf.addKeyListener(new KeyAdapter() {
                 public void keyPressed(KeyEvent e) {
                     // 獲取對應(yīng)的鍵盤字符
                     char keyChar = e.getKeyChar();
                     // 獲取對應(yīng)的鍵盤字符代碼
                     int keyCode = e.getKeyCode();
                     System.out.print("鍵盤按下的字符內(nèi)容為:" + keyChar+" ");
                     System.out.println("鍵盤按下的字符代碼為:" + 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中的文件框中鍵入字符時,便觸發(fā)了鍵盤事件,會執(zhí)行重寫的keyPressed()方法。這時,可以通過KeyEvent類的getKeyChar()方法獲取鍵盤鍵入的字符,通過getKeyCode()方法可以獲取輸入字符對應(yīng)的整數(shù)值。在圖5所示的窗口中,依次輸入鍵盤上的a、s、1字符時,控制臺將按鍵對應(yīng)的名稱和鍵值(keyCode)打印了出來,如圖6所示。

1619692372894_46.png

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


4.動作事件

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

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





猜你喜歡:

Swing JDialog容器和JFrame容器使用教程

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

Java事件監(jiān)聽器的工作步驟介紹

傳智教育java高級軟件工程師培訓(xùn)

0 分享到:
和我們在線交談!