首頁技術文章正文

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

更新時間:2021-04-29 來源:黑馬程序員 瀏覽量:

1577370495235_學IT就到黑馬程序員.gif


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

1.窗體事件

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

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

接下來通過一個案例來實現(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);
             // 使用內部類創(chuàng)建WindowListener實例對象,監(jiān)聽窗體事件
             f.addWindowListener(new WindowListener() {
                 public void windowOpened(WindowEvent e) {
                     System.out.println("windowOpened---窗體打開事件");
                 }
                 public void windowIconified(WindowEvent e) {
                     System.out.println("windowIconified---窗體圖標化事件");
                 }
                 public void windowDeiconified(WindowEvent e) {
                   System.out.println("windowDeiconified---窗體取消圖標化事件");
                 }
                 public void windowDeactivated(WindowEvent e) {
                     System.out.println("windowDeactivated---窗體停用事件");
                 }
                 public void windowClosing(WindowEvent e) {
                     System.out.println("windowClosing---窗體正在關閉事件");
                 }
                 public void windowClosed(WindowEvent e) {
                     System.out.println("windowClosed---窗體關閉事件");
                 }
                 public void windowActivated(WindowEvent e) {
                     System.out.println("windowActivated---窗體激活事件");
                 }
             });
         }
         public static void main(String[] args) {
             // 使用SwingUtilities工具類調用createAndShowGUI()方法并顯示GUI程序
             SwingUtilities.invokeLater(Example07::createAndShowGUI);
         }
     }
運行結果如圖1所示。

1619692314203_41.png

圖1 運行結果

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

1619692322619_42.png

圖2 運行結果


2.鼠標事件

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

接下來通過一個案例來學習如何監(jiān)聽鼠標事件,如文件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());       // 為窗口設置布局
             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);                              // 在窗口添加按鈕組件
             // 為按鈕添加鼠標事件監(jiān)聽器
             but.addMouseListener(new MouseListener() {
                 public void mouseReleased(MouseEvent e) {
                     System.out.println("mouseReleased-鼠標放開事件");
                 }
                 public void mousePressed(MouseEvent e) {
                     System.out.println("mousePressed-鼠標按下事件");
                 }
                 public void mouseExited(MouseEvent e) {
                     System.out.println("mouseExited—鼠標移出按鈕區(qū)域事件");
                 }
                 public void mouseEntered(MouseEvent e) {
                     System.out.println("mouseEntered—鼠標進入按鈕區(qū)域事件");
                 }
                 public void mouseClicked(MouseEvent e) {
                     System.out.println("mouseClicked-鼠標完成單擊事件");
                 }
             });
         }
         public static void main(String[] args) {
             // 使用SwingUtilities工具類調用createAndShowGUI()方法并顯示GUI程序
             SwingUtilities.invokeLater(Example08::createAndShowGUI);
         }
     }

運行結果如圖3所示。

1619692331503_43.png

圖3 運行結果

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

1619692337320_44.png

圖4 運行結果

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

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

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

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

3.鍵盤事件

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

接下來通過一個案例來學習如何監(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)建文本框對象
             f.add(tf);                               // 在窗口中添加文本框組件
             f.setVisible(true);
             f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              // 為文本框添加鍵盤事件監(jiān)聽器
             tf.addKeyListener(new KeyAdapter() {
                 public void keyPressed(KeyEvent e) {
                     // 獲取對應的鍵盤字符
                     char keyChar = e.getKeyChar();
                     // 獲取對應的鍵盤字符代碼
                     int keyCode = e.getKeyCode();
                     System.out.print("鍵盤按下的字符內容為:" + keyChar+" ");
                     System.out.println("鍵盤按下的字符代碼為:" + keyCode);
                 }
             });
         }
         public static void main(String[] args) {
             // 使用SwingUtilities工具類調用createAndShowGUI()方法并顯示GUI程序
             SwingUtilities.invokeLater(Example09::createAndShowGUI);
         }
     }

運行結果如圖5所示。

1619692362702_45.png

圖5 運行結果

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

1619692372894_46.png

圖6 運行結果


4.動作事件

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

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





猜你喜歡:

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

Swing頂級容器:JFrame和JDialog介紹

Java Swing 布局管理器使用教程    
黑馬程序員高級java工程師培訓

分享到:
在線咨詢 我要報名
和我們在線交談!