java事件机制了解(初级)

本文深入探讨了Java中的事件机制,包括事件对象、事件源和事件监听器的概念及其实现方式,并通过具体案例进行说明。此外,还介绍了使用POI库以事件模式导入Excel文件的方法,包括依赖项配置、事件处理器设计和数据读取流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java中的事件机制


3种角色:
1.event object:事件对象,作为参数,一般存在与listerner的方法之中. (超类:java.util.EventObject)

2.event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。

3.event listener:事件监听类,当监听到event object产生的时候,它就调用相应的方法,进行处理。 (超接口:java.util.EventListener)

package com.atguigu.event.door;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

/**
 * 事件源,在这里你可以把它想象成一个控制开门关门的遥控器
 * 开门按钮:事件源 DoorButton
 * 开门:事件 DoorEvent
 * 监听开门: 监听器 DoorListener1
 */
public class DoorButton {
    private Collection listeners;
    /**
     * 添加事件
     * @param listener DoorListener
     */
    public void addDoorListener(DoorListener listener) {
        if (listeners == null) {
            listeners = new HashSet();
        }
        listeners.add(listener);
    }

    /**
     * 移除事件
     * @param listener DoorListener
     */
    public void removeDoorListener(DoorListener listener) {
        if (listeners == null)
            return;
        listeners.remove(listener);
    }

    /**
     * 触发开门事件
     */
    protected void fireWorkspaceOpened() {
        if (listeners == null)
            return;
        DoorEvent event = new DoorEvent(this, "open");
        notifyListeners(event);
    }

    /**
     * 触发关门事件
     */
    protected void fireWorkspaceClosed() {
        if (listeners == null)
            return;
        DoorEvent event = new DoorEvent(this, "close");
        notifyListeners(event);
    }

    /**
     * 通知所有的DoorListener
     */
    private void notifyListeners(DoorEvent event) {
        Iterator iter = listeners.iterator();
        while (iter.hasNext()) {
            DoorListener listener = (DoorListener) iter.next();
            listener.doorEvent(event);
        }
    }
}


package com.atguigu.event.door;

import java.util.EventObject;

/**
 * 事件: 开/关门
 */
public class DoorEvent extends EventObject {
    private String doorState = "";//表示门的状态,有“开”和“关”两种

    public DoorEvent(Object source, String doorState) {
        super(source);
        this.doorState = doorState;
    }

    public void setDoorState(String doorState) {
        this.doorState = doorState;
    }

    public String getDoorState() {
        return this.doorState;
    }
}


package com.atguigu.event.door;

import java.util.EventListener;

/**
 * 定义事件监听接口
 */
public interface DoorListener extends EventListener {
    void doorEvent(DoorEvent event);
}


package com.atguigu.event.door;

/**
 * 监听器:监听事件 DoorEvent
 */
public class DoorListener1 implements DoorListener {
    public void doorEvent(DoorEvent event) {
        if(event.getDoorState()!=null&&event.getDoorState().equals("open")){
            System.out.println("门1打开");
        }else{
            System.out.println("门1关闭");
        }
    }
}


package com.atguigu.event.door;

public class DoorListener2 implements DoorListener {
    public void doorEvent(DoorEvent event) {
        if(event.getDoorState()!=null&&event.getDoorState().equals("open"))
        {
            System.out.println("门2打开,同时打开走廊的灯");
        }else{
            System.out.println("门2关闭,同时关闭走廊的灯");
        }
    }
}


package com.atguigu.event.door;

/**
 * https://www.iteye.com/blog/zmfkplj-629678
 */
public class DoorMain {
    public static void main(String []args)
    {
        DoorButton doorButton = new DoorButton(); //事件:开/关门按钮
        doorButton.addDoorListener(new DoorListener1());//给门1增加监听器
        doorButton.addDoorListener(new DoorListener2());//给门2增加监听器
        //开门
        doorButton.fireWorkspaceOpened();
        System.out.println("我已经进来了");
        //关门
        doorButton.fireWorkspaceClosed();
    }
}

 

Excel基于事件模式导入

poi三种模式:
   用户模式 : 导入/导出
   事件模式 : 导入
   SXSSF对象 : 导出

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>



package com.atguigu.event.excel;

import lombok.Data;

@Data
public class ClientExcelImportReq {
    String clientId;
    String name;
}



package com.atguigu.event.excel;

import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.usermodel.XSSFComment;

/**
 * 事件处理器
 */
public class SheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler {
    ClientExcelImportReq entity;

    public void startRow(int rowIndex) {
        if(rowIndex > 0)
            entity = new ClientExcelImportReq();
    }

    public void endRow(int i) {
        if(null != entity)
            System.out.println(entity);
    }

    public void cell(String cellReference, String value, XSSFComment xssfComment) {
        if(null != entity){
            String sub = cellReference.substring(0, 1);
            switch (sub){
                case "A" :
                    entity.setClientId(value);
                    break;
                case "B":
                    entity.setName(value);
                    break;
                default:
                    break;
            }
        }
    }

    public void headerFooter(String s, boolean b, String s1) {

    }
}


package com.atguigu.event.excel;

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.model.StylesTable;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import java.io.InputStream;
import java.util.Iterator;


public class TestImportExcel {
    public static void main(String[] args) throws Exception {
        String path = "E:\\test.xlsx";
        OPCPackage opcPackage = OPCPackage.open(path, PackageAccess.READ);
        XSSFReader reader = new XSSFReader(opcPackage);
        StylesTable stylesTable = reader.getStylesTable();
        ReadOnlySharedStringsTable table = new ReadOnlySharedStringsTable(opcPackage);
        //Sax的reader
        XMLReader xmlReader = XMLReaderFactory.createXMLReader();
        //注册事件处理器
        XSSFSheetXMLHandler xmlHandler = new XSSFSheetXMLHandler(stylesTable, table, new SheetHandler(), false);
        xmlReader.setContentHandler(xmlHandler);
        //逐行读取
        Iterator<InputStream> sheetsData = reader.getSheetsData();
        XSSFReader.SheetIterator sheetIterator = (XSSFReader.SheetIterator) sheetsData;
        while (sheetIterator.hasNext()){
            InputStream is = sheetIterator.next(); //每个sheet流数据
            InputSource inputSource = new InputSource(is); //输入源
            xmlReader.parse(inputSource);
        }


    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值