java - 如何优化我的代码来处理这个特殊事件

标签 java swing jakarta-ee

我的程序监听 3 种类型的事件:ADD、DELETE、REFRESH,这些事件由 UI 上的第 3 方库组件触发。我的听众看起来像这样:

//the timestamp is the time when the event occurs
public void listenToEvent(Event event, long timestamp){
     if(event.getName().equals("ADD")){
           //handle ADD event

     }else if(event.getName().equals("DELETE")){
          //handle DELETE event

    }else if(event.getName().equals("REFRESH")){
          //handle REFRESH event

    }

}

该代码对于每个事件都工作正常,除了 REFRESH 事件有一点问题:

当 UI 上发生刷新时,第 3 方 lib 组件会在短时间内连续触发 3 个事件,即:ADD->DELETE->REFRESH,在这种情况下,我的监听器认为有 3 个事件,但实际上它只是一个UI 上的刷新操作。

如何优化我的代码,以便当 ADD->DELETE->REFRESH 非常快地连续发生时,我的监听器可以足够聪明地知道这只是一个 REFRESH?

(ADD 和 DELETE 事件不是 REFRESH 事件的实例)

最佳答案

正如我在评论中已经说过的,我在下面发布的这段代码正在运行(经过测试)。您可能需要对 REFRESH_TIMEOUT 进行一些调整,并可能使其成为线程安全的,但我已经测试了基本想法:

“如果ADD事件到来,则为其创建一个定时器。当DELETE到来时,检查是否已经有定时器任务。如果没有->处理DELETE。如果有->处理REFRESH。如果定时器到期->处理添加”

这有点像黑客,但根据您提供的信息,我认为这个解决方案可能是最简单的事情。如果正确的事件来得比 REFRESH_TIMEOUT 快,您可能会遇到问题。在这种情况下,逻辑会变得有点复杂。

long REFRESH_TIMEOUT=100;
Timer timer = null;
MyTask myTask = null;
public void listenToEvent(Event event, long timestamp){
    if(event.getName().equals("ADD")){
        timer = new Timer();
        timer.schedule(myTask = new MyTask(event), REFRESH_TIMEOUT);
    }
    if(event.getName().equals("DELETE")){
        if (myTask!=null && !myTask.expired){
            processRefresh(event);
            timer.cancel();
        }else{
            processDelete(event);
        }
    }
}

private static class MyTask extends TimerTask {
    Event event;
    boolean expired;
    public MyTask(Event event){
        this.event=event;
    }
    @Override
    public void run() {
        expired=true;
        processAdd(event);
    }
}

private void processAdd(Event e){
    ...
}
private void processDelete(Event e){
    ...
}
private void processRefrsh(Event e){
    ...
}

关于java - 如何优化我的代码来处理这个特殊事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18889141/

相关文章:

java - 为什么在远程 EJB3 session Bean 上使用 InitialContext

java - 通过在 jtextfield 中获取字符串,在 java 中使用 LIKE 选择所有数据

java - 添加 spring-boot-admin-starter-client 依赖项后无法解析占位符

java - Guava:图表的复制构造函数

java - Swing Scala 问题 - 面板 100% 扩展

java - 用 JTree 自动换行

java - 防止加速器在输入子项时触发

java - Google Play 游戏服务中基于套接字与不可靠的消息传递

java - 如何从 servlet 设置永不过期的 Cookie?

java - 在带有 Spring 的 Web 应用程序中使用 Quartz