事件監聽器

来源:https://www.cnblogs.com/Auci/archive/2022/04/03/16095888.html
-Advertisement-
Play Games

《零基礎學Java》 事件監聽器 為按鈕等添加事件監聽器,事件監聽器的作用是在用戶單擊按鈕時,設置窗體要實現的功能。 動作事件監聽器 動作事件監聽器(AbstractAction)監聽器是Swing中比較常用的事件監聽器,很多最近的動作都會使用它監聽(比如:按鈕被單擊)。 動作事件監聽器 動作事件監 ...


《零基礎學Java》


  • 事件監聽器

    為按鈕等添加事件監聽器,事件監聽器的作用是在用戶單擊按鈕時,設置窗體要實現的功能。

  • 動作事件監聽器

動作事件監聽器(AbstractAction)監聽器是Swing中比較常用的事件監聽器,很多最近的動作都會使用它監聽(比如:按鈕被單擊)。

動作事件監聽器

動作事件監聽器 實例

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

public class Demo17 extends JFrame {
    public Demo17(){
        setBounds(100,100,300,200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        JLabel jLabel = new JLabel("標簽");
        c.add(jLabel);

        /**
         * 為 按鈕 添加動作監聽
         */
        JButton jButton = new JButton("按鈕");
        jButton.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jLabel.setText("按鈕被點擊");
            }
        });
        c.add(jButton);

        /**
         * 為 文本框 添加動作監聽
         */
        JTextField jTextField = new JTextField(10);
        c.add(jTextField);
        jTextField.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Object obj = e.getSource();//捕捉這個動作由那個按鍵觸發的
                JTextField jTextField1 = (JTextField)obj;
                System.out.println(jTextField1.getText());

                jLabel.setText("文本框中點擊了回車");
            }
        });

        /**
         * 為 多選框 添加動作監聽
         */
        JCheckBox jCheckBox = new JCheckBox("多選框");
        c.add(jCheckBox);
        jCheckBox.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jLabel.setText("多選框被點擊");
            }
        });

        /**
         * 為 單選框 添加動作監聽
         */
        JRadioButton jRadioButton = new JRadioButton("單選框");
        c.add(jRadioButton);
        jRadioButton.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jLabel.setText("單選框被點擊");
            }
        });

        /**
         * 為 下拉列表 添加動作監聽
         */
        String string[] = {"選項1","選項2"};
        JComboBox jComboBox = new JComboBox(string);
        c.add(jComboBox);
        jComboBox.addActionListener(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jLabel.setText("下拉列表被選擇");
            }
        });

        setVisible(true);
    }

    public static void main(String[] args) {
        new Demo17();
    }
}

動作事件監聽器 實例輸出結果:

  • 鍵盤事件

    當向文本框中輸入文本內容時,將觸發鍵盤事件。KeyEvent類 負責捕獲鍵盤事件,可以通過為組
    件添加實現了 KeyListener介面 的監聽器類,來處理該組件觸發的鍵盤事件。

    KeyListener介面的三個方法:

    keyListener.addKeyListener(new KeyListener() {
                @Override
                public void keyTyped(KeyEvent e) {
    			//發生擊鍵事件時觸發
                }
    
                @Override
                public void keyPressed(KeyEvent e) {
    			//按鍵被按下時觸發
                }
    
                @Override
                public void keyReleased(KeyEvent e) {
                //按鍵被釋放時觸發
                }
            });
    

    KeyListener類的常用方法:

(PS:在 KeyEvent類 中以 “VK_” 開頭的靜態常量代表各個按鍵的 keyCode,可以通過這些
靜態常量判斷事件中的按鍵,獲得按鍵的標簽。)

鍵盤事件 實例:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class LoginAuthentication extends JFrame {

    private JPanel jPanel1;
    private JPanel jPanel2;
    private JTextField account;
    private JPasswordField password;
    private JButton jButton;
    private String zh = "123";
    private String mm = "456";

    public LoginAuthentication() {
        setBounds(100, 100, 320, 230);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("目前狀態:正在登錄中");

        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        jPanel1 = new JPanel(new FlowLayout());
        jPanel1.setBorder(BorderFactory.createTitledBorder("賬號"));
        account = new JTextField(20);
        account.addKeyListener(new KeyListener() {//創建鍵盤事件
            @Override
            public void keyTyped(KeyEvent e) {

            }

            @Override
            public void keyPressed(KeyEvent e) {

            }

            @Override
            public void keyReleased(KeyEvent e) {
                int dl = e.getKeyCode();
                switch (dl) {
                    case KeyEvent.VK_ENTER:
                        password.requestFocus();
                        return;
                }
            }
        });
        jPanel1.add(account);
        c.add(jPanel1);

        jPanel2 = new JPanel(new FlowLayout());
        jPanel2.setBorder(BorderFactory.createTitledBorder("密碼"));
        password = new JPasswordField(20);
        jPanel2.add(password);
        c.add(jPanel2);

        jButton = new JButton("登錄");
        jButton.addActionListener(new AbstractAction() {//創建滑鼠事件
            @Override
            public void actionPerformed(ActionEvent e) {
                if (account.getText().equals(zh)) {
                    char ch[] = password.getPassword();
                    String zhu = new String(ch);
                    if (zhu.equals(mm)) {
                        System.out.println("登錄成功");
                        setTitle("目前狀態:登錄成功");
                    }else{
                        System.out.println("登錄失敗");
                        setTitle("目前狀態:登錄失敗");
                    }
                }else {
                    System.out.println("登錄失敗");
                    setTitle("目前狀態:登錄失敗");
                }
            }
        });
        c.add(jButton);

        setVisible(true);
    }

    public static void main(String[] args) {
        new LoginAuthentication();
    }
}

鍵盤事件 實例輸出結果:

  • 滑鼠事件

    所有組件都能應用滑鼠事件, MouseEvent類 負責捕獲滑鼠事件,可以通過為組件添加實現了
    MouseListener介面的監聽器類來處理該組件觸發的滑鼠事件。MouseListener介面 共有5個抽象方法,分別在游標移入游標移出滑鼠按鍵被按下滑鼠按鍵被釋放滑鼠按鍵被單擊 事件時被觸發。

    MouseListener介面的五個方法:

 clickArea.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //滑鼠點擊
            }

            @Override
            public void mousePressed(MouseEvent e) {
				//按鍵按下
            }

            @Override
            public void mouseReleased(MouseEvent e) {
				//按鍵釋放
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                //滑鼠進入
            }

            @Override
            public void mouseExited(MouseEvent e) {
         		//滑鼠退出
            }
        });

MouseEvent類的常用方法:

MouseEvent類中代表滑鼠按鍵的靜態常量:

滑鼠事件 實例:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Demo19 extends JFrame {
    private JScrollPane jScrollPane;
    private JTextArea out;
    private JPanel promptArea;
    private JPanel clickArea;

    public Demo19(){
        setBounds(100,100,450,400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("滑鼠事件");

        Container c =getContentPane();
        c.setLayout(new GridLayout(1,2));

        promptArea=new JPanel(new FlowLayout());
        promptArea.setBorder(BorderFactory.createTitledBorder("輸出區域"));
        out=new JTextArea("",18,18);
        jScrollPane=new JScrollPane(out);
        promptArea.add(jScrollPane);
        c.add(promptArea);

        clickArea=new JPanel(new FlowLayout());
        clickArea.setBorder(BorderFactory.createTitledBorder("點擊區域"));
        clickArea.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {//滑鼠點擊
                int hitCount = e.getClickCount();//滑鼠點擊次數
                int clickButton = e.getButton();//滑鼠點擊的按鍵
                switch (clickButton){
                    case MouseEvent.BUTTON1:
                        out.append("滑鼠左鍵點擊了"+hitCount+"次組件\n");
                        break;
                    case MouseEvent.BUTTON2:
                        out.append("滑鼠中鍵點擊了"+hitCount+"次組件\n");
                        break;
                    case MouseEvent.BUTTON3:
                        out.append("滑鼠右鍵點擊了"+hitCount+"次組件\n");
                        break;
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {//按鍵按下

            }

            @Override
            public void mouseReleased(MouseEvent e) {//按鍵釋放

            }

            @Override
            public void mouseEntered(MouseEvent e) {//滑鼠進入
                out.append("滑鼠進入組件\n");
            }

            @Override
            public void mouseExited(MouseEvent e) {//滑鼠退出
                out.append("滑鼠退出組件\n");
            }
        });
        c.add(clickArea);




        setVisible(true);
    }

    public static void main(String[] args) {
        new Demo19();
    }
}

滑鼠事件 實例輸出結果:

  • 窗體事件

    WindowListener介面中五個方法:

    public DemoWindw(){
            addWindowListener(new MywindowListener());//創建窗體事件監聽
        }
    
    class MywindowListener implements WindowListener{
    
            @Override
            public void windowOpened(WindowEvent e) { 
              	//窗體打開
            }
    
            @Override
            public void windowClosing(WindowEvent e) {
                //窗體將要關閉
            }
    
            @Override
            public void windowClosed(WindowEvent e) {
                //窗體已經關閉
            }
    
            @Override
            public void windowIconified(WindowEvent e) {
                //窗體最小化
            }
    
            @Override
            public void windowDeiconified(WindowEvent e) {
                //窗體恢復正常大小
            }
    
            @Override
            public void windowActivated(WindowEvent e) {
                //窗體激活
            }
    
            @Override
            public void windowDeactivated(WindowEvent e) {
                //窗體失去激活
            }
        }
    

    窗體事件 實例:

    import javax.swing.*;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    
    public class Demo20 extends JFrame {
        public Demo20(){
            setBounds(100,100,300,300);
            /**
             * EXIT_ON_CLOSE:關閉視窗同時停止程式
             * DISPOSE_ON_CLOSE:關閉視窗時釋放窗體資源
             */
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setVisible(true);
    
            addWindowListener(new MywindowListener());//創建窗體事件監聽
        }
    
        class MywindowListener implements WindowListener{
    
            @Override
            public void windowOpened(WindowEvent e) { //窗體打開
                System.out.println("窗體被打開");
            }
    
            @Override
            public void windowClosing(WindowEvent e) {//窗體將要關閉
                System.out.println("窗體將要被關閉");
            }
    
            @Override
            public void windowClosed(WindowEvent e) {//窗體已經關閉
                /**
                 * 如果使用EXIT_ON_CLOSE(關閉視窗同時停止程式)可能無法觸發此方法
                 */
                System.out.println("窗體已經被關閉");
            }
    
            @Override
            public void windowIconified(WindowEvent e) {//窗體最小化
                System.out.println("窗體最小化");
            }
    
            @Override
            public void windowDeiconified(WindowEvent e) {//窗體恢復正常大小
                System.out.println("窗體恢復正常大小");
            }
    
            @Override
            public void windowActivated(WindowEvent e) {//窗體激活
                System.out.println("窗體被激活");
            }
    
            @Override
            public void windowDeactivated(WindowEvent e) {//窗體失去激活
                System.out.println("窗體失去激活");
            }
        }
    
        public static void main(String[] args) {
            new Demo20();
        }
    }
    

    窗體事件 實例輸出結果:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 可以讀寫基本數據類型的數據 * 數據輸入流:DataInputStream * DataInputStream(InputStream in) * 數據輸出流:DataOutputStream * DataOutputStream(OutputStream out) package cn.itcas ...
  • 最近棧長看到各種 Firefox 瀏覽器禁止中國用戶的消息,簡單說就是 Firefox 中國無法使用去廣告插件。 這到底是怎麼回事呢? 我於是去 Firefox 搜索了去廣告插件: 比如說打開第一個:AdGuard AdBlocker: 還真的不能用了,什麼鬼?? 打開網路面板,看看頁面的響應信息: ...
  • 一、什麼是scrapy? Scrapy,Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。Scrapy用途廣泛,可以用於數據挖掘、監測和自動化測試. 其最初是為了頁面抓取 (更確切來說, 網路抓取 )所設計的, 後臺也應用在獲取API所返回的 ...
  • 前面幾篇博客,說了很多dubbo服務提供者相關的流程; 複習一下:首先服務提供者去暴露服務介面數據到註冊中心,然後本地啟動netty服務端監聽是否有消費者的請求,現在我們可以看看消費者端是怎麼從註冊中心獲取指定的介面信息, 然後訪問netty服務端,就行了; 提前須知:要提前瞭解spring的ioc ...
  • 假期玩嗨了吧,我給你準備了六個小游戲,有膽子來玩一玩嗎?我自己是玩了很多遍的,所以想讓大家一起玩,獨樂樂不如眾樂樂。代碼放在下麵。 1、小恐龍 玩法:上下控制起跳躲避 源碼分享: Python學習交流Q群:906715085### import cfg import sys import rando ...
  • 又到每日分享Python小技巧的時候了,我真是太開心了。今天給大家分享的是模擬太陽系行星運轉。聽起來就很不錯,效果出來的時候也是很不錯的,讓我們一起期待。 1、準備材料 首先我們需要準備這樣一些材料 宇宙背景圖 背景透明的行星圖 2:編寫代碼 代碼分塊詳解 導入需要的模塊 ###Python學習交流 ...
  • 最近我看好多人的朋友圈都流行發九宮格照片,別人都能擁有,碼農必須有。當然,我們要比其他人更為高調,我們就用Python來對圖片進行處理,這肯定能秀翻你的朋友圈。廢話不說,開乾。 一、圖片導入與信息查看 在對圖像進行處理之前,我們首先需要載入出來一張圖片,我們以載入文件中存在的圖像為例子,載入圖片並查 ...
  • 繼承 繼承1 繼承的好處2 繼承的細節3 如果父類和子類都有同一個屬性(比如name)那麼查找時遵循以下原則4 this和super區分 1 繼承的好處 代碼的復用性提高了 代碼的擴展性和維護性提高了 2 繼承的細節 子類繼承了所有的屬性和方法,非私有的屬性和方法可以在子類直接訪問,私有的屬性pri ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...