Java中的事件監聽機制

来源:http://www.cnblogs.com/cbs-writing/archive/2017/06/24/7073060.html
-Advertisement-
Play Games

滑鼠事件監聽機制的三個方面: 1.事件源對象: 事件源對象就是能夠產生動作的對象。在Java語言中所有的容器組件和元素組件都是事件監聽中的事件源對象。Java中根據事件的動作來區分不同的事件源對象,動作發生在哪個組件上,那麼該組件就是事件源對象 2.事件監聽方法: addMouseListener( ...


滑鼠事件監聽機制的三個方面:

1.事件源對象:

  事件源對象就是能夠產生動作的對象。在Java語言中所有的容器組件和元素組件都是事件監聽中的事件源對象。Java中根據事件的動作來區分不同的事件源對象,動作發生在哪個組件上,那麼該組件就是事件源對象

2.事件監聽方法:

  addMouseListener(MouseListener ml) ;該方法主要用來捕獲滑鼠的釋放,按下,點擊,進入和離開的動作;捕獲到相應的動作後,交由事件處理類(實現MouseListener介面)進行處理。

  addActionListener(ActionListener al);捕獲類似按鈕組件上的滑鼠點擊動作或者是類似輸入框組件上的鍵盤迴車動作;然後將動作以及相關信息交由事件處理類(實現ActionListener介面)的相應方法進行處理。

  addMouseMotionListener(MouseMotionListener mml);捕獲滑鼠的移動和拖動動作;然後將動作以及相關信息交由事件處理類(實現MouseMotionListener 介面)的相應方法進行處理。

  addKeyListener(KeyListener kl);捕獲事件源對象上的鍵盤按鍵的按下、釋放和敲擊動作;然後將動作以及相關信息交由事件處理類(實現KeyListener 介面)的相應方法進行處理。

3.事件介面(事件處理類,也即實現了事件介面的類):

  MouseListener     滑鼠事件介面,有按下,釋放,點擊,進入和離開的事件處理方法

  ActionListener     動作事件介面,有動作對應的事件處理方法

  MouseMotionListener    滑鼠移動事件介面,有移動和拖動的事件處理方法

  KeyLisetener       鍵盤事件介面,有釋放,按下和敲擊的事件處理方法

瞭解了事件監聽的這三個方面之後,我們要對組件添加事件的監聽就很容易了。下麵是一個小例子:

目標:創建一個簡易的繪圖板,可以實現按下相應的功能來達到不同的繪畫目的。

分析:   1.首選需要一個畫圖板的簡易界面,定義一個Draw類使用Java的Swing組件進行界面的初始化。

    2.然後定義事件介面DrawListener類,讓它實現以上的介面,重寫介面中的方法,達到自己的目的。

    3.在Draw中實例化DrawListener類的對象。

    4.為Draw類中的組件添加事件監聽方法,指定事件處理類為DrawListener。

代碼實現:

Draw類

package com.cbs;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * Draw類,用於界面的初始化
 * 
 * @author CBS
 * 
 */
public class Draw {

    public static void main(String[] args) {
        Draw t = new Draw();
        t.showUI();

    }

    // 界面初始化方法
    public void showUI() {
        JFrame jf = new JFrame();
        jf.setTitle("畫圖");
        jf.setSize(700, 700);
        jf.setDefaultCloseOperation(3);
        jf.setLocationRelativeTo(null);
        FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
        jf.setLayout(layout);
        JButton drawLine = new JButton("畫直線");
        jf.add(drawLine);
        JButton drawOval = new JButton("畫橢圓");
        jf.add(drawOval);
        JButton drawArc = new JButton("畫曲線");
        jf.add(drawArc);
        JButton drawPolygon = new JButton("三角形");
        jf.add(drawPolygon);
        JButton jb1 = new JButton();
        jb1.setBackground(Color.RED);
        jf.add(jb1);
        jb1.setPreferredSize(new Dimension(30, 30));
        JButton jb2 = new JButton();
        jb2.setBackground(Color.GREEN);
        jf.add(jb2);
        jb2.setPreferredSize(new Dimension(30, 30));

        jf.setVisible(true);

        Graphics g = jf.getGraphics();// 獲取當前的畫筆
        DrawListener dl = new DrawListener(g);// 實例化DrawListener類的對象
        jf.addMouseListener(dl);// 為窗體添加滑鼠事件監聽方法
        jf.addMouseMotionListener(dl);// 為窗體添加滑鼠移動事件監聽方法

        // 為按鈕添加動作監聽
        drawLine.addActionListener(dl);
        drawOval.addActionListener(dl);
        jb1.addActionListener(dl);
        jb2.addActionListener(dl);
        drawArc.addActionListener(dl);
        drawPolygon.addActionListener(dl);

    }

}

DrawListener類

package com.cbs;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;

/**
 * 事件處理類
 * 
 * @author CBS
 * 
 */

public class DrawListener implements MouseListener, MouseMotionListener,
        ActionListener {

    private int x1, y1, x2, y2;// 記錄兩次滑鼠的點擊坐標
    private Graphics g;// 從界面獲取畫布對象
    private String str;// 記錄當前按鈕的信息,區分不同的按鈕
    private Color color;// 記錄畫筆的顏色信息
    private int f = 1;// 控制變數,用於更新坐標

    public DrawListener(Graphics g) {
        this.g = g;
    }

    //滑鼠按下時的處理方法
    public void mousePressed(MouseEvent e) {
        // 記錄第一次點擊的位置;由對象e得到
        if (f == 1) {
            x1 = e.getX();
            y1 = e.getY();
        }
    }

    //滑鼠點擊時的處理方法
    public void mouseClicked(MouseEvent e) {
        if ("三角形".equals(str)) {
            System.out.println("sanjaioxing");
            int x, y;
            x = e.getX();
            y = e.getY();
            g.setColor(color);
            g.drawLine(x, y, x1, y1);
            g.drawLine(x2, y2, x, y);
            f = 1;

        }

    }

    // 滑鼠釋放時的處理方法
    public void mouseReleased(MouseEvent e) {
        // 記錄滑鼠釋放時的坐標
        if (f == 1) {
            x2 = e.getX();
            y2 = e.getY();
        }
        // 兩個坐標的得到了,可以用於直線的繪製,調用畫布對象g方法,在界面上面畫出直線
        if ("畫直線".equals(str)) {
            g.setColor(color);
            g.drawLine(x1, y1, x2, y2);
        }
        if ("畫橢圓".equals(str)) {
            g.setColor(color);
            g.drawOval(x1, y1, x2, y2);
        }
        if ("三角形".equals(str) && f == 1) {
            g.setColor(color);
            g.drawLine(x1, y1, x2, y2);
            f++;
        }
    }

    // 滑鼠進入時的處理方法
    public void mouseEntered(MouseEvent e) {

    }

    // 滑鼠退出時的處理方法
    public void mouseExited(MouseEvent e) {

    }

    public void actionPerformed(ActionEvent e) {
        if ("".equals(e.getActionCommand())) {
            JButton jb = (JButton) e.getSource();
            color = jb.getBackground();
        } else {
            str = e.getActionCommand();
        }
    }

    // 滑鼠拖動時的處理方法
    public void mouseDragged(MouseEvent e) {
        if ("畫曲線".equals(str)) {
            int x, y;
            x = e.getX();
            y = e.getY();
            g.setColor(color);
            g.drawLine(x1, y1, x, y);
            x1 = x;
            y1 = y;
        }

    }

    // 滑鼠釋放時的移動方法
    public void mouseMoved(MouseEvent e) {
    
    }

}

 ps:純屬一孔之見,歡迎指正。


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

-Advertisement-
Play Games
更多相關文章
  • 避免使用終結器 如果沒有必要,是不需要實現一個終結器(Finalizer)。終結器的代碼主要是讓GC回收非托管資源用。它會在GC完成標記對象為可回收後,放入一個終結器隊列里,在由另外一個線程執行隊列里對象的終結器方法。這就意味著,如果你實現一個類的終結器,你必須保證在它在終結器執行後能被正常回收。這 ...
  • 概述: Windows Presentation Foundation (WPF) 提供了一組服務,這些服務可用於擴展公共語言運行時 (CLR) 屬性的功能。這些服務通常統稱為 WPF 屬性系統。由 WPF 屬性系統支持的屬性稱為依賴項屬性。 依賴項屬性提供用來擴展屬性功能的功能, 最常用的莫過於“ ...
  • Lambda 表達式是一種可用於創建 委托 或 表達式目錄樹 類型的 匿名函數 。 通過使用 lambda 表達式,可以寫入可作為參數傳遞或作為函數調用值返回的本地函數。 Lambda 表達式對於編寫 LINQ 查詢表達式特別有用。 若要創建 Lambda 表達式,需要在 Lambda 運算符 => ...
  • Python是一種簡單易學,且功能強大的編程語言。它是面向對象的編程語言。 Python環境安裝配置: Python是一種通用的電腦編程語言,它可以應用於web,Desktop以及game中,在使用Python時最好使用 Python數字 Python字元串 Python列表 Python元組 P ...
  • 公司用的是mysql5.6,該異常是mysql字元集問題,mysql支持的 utf8編碼最大字元長度為 3 位元組,如果遇到表情符這樣的4 位元組的字元就會插入異常。 解決方法: 1.在資料庫層面處理,重新設置資料庫編碼,對資料庫數據進行遷移,對單資料庫應用需停機操作; 2.在程式中進行處理,一般項目都 ...
  • 最近的練手項目使用的是 Maven 在管理項目,在使用 Maven 管理項目時,三層的開發時分模塊開發的,parent-dao-service-web,所有的spring+struts + Hibernate的依賴都是加在 parent 上,dao-service-web都是作為子模塊,在模塊之間的... ...
  • 進程: 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import multiprocessing,threading,time 5 6 def run(name): 7 t=threading.Thread(ta ...
  • 一.緣起 剛剛工作兩年,技術還很挫。但是在學習Java的過程中,看到過不少好書,寫下這篇博客不僅是為了推薦,過去學習經歷的一個總結。如果時間能夠重來的話,我將按照以下書單來學習Java。 二.Java基礎篇 1. Head First Java Head First系列又名大頭書系列,這個系列的書都 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...