首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取组件的最后一个调整大小事件

获取组件的最后一个调整大小事件
EN

Stack Overflow用户
提问于 2013-06-27 16:29:40
回答 1查看 1.1K关注 0票数 5

当使用ComponentListener来获得调整大小事件的通知时,如果用户将窗口角拖到新的大小,可能会得到很多事件。

现在,我需要对一个调整大小的事件进行一些昂贵的计算。如果这种情况经常发生,那就太多了。可以忽略大多数事件,只对最后一个事件做出反应(例如,如果用户释放了鼠标按钮)。问题是,我不知道如何找出上一次调整大小的事件是什么。如果我做了一个天真的方法:

代码语言:javascript
复制
this.addComponentListener(new ComponentAdapter() {
  @Override
  public void componentResized(final ComponentEvent e) {
    if (calculationInProgress){
      return;
    }

    calculationInProgress= true;
    doExpensiveCalculation();
    calculationInProgress= false;        
  }
});

在最后一次计算之后,窗口的大小可能会调整得更多,因此计算将不会与正确的最终尺寸相匹配。

对此有什么好的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2018-07-06 08:38:04

下面是评论中讨论的Timer-based解决方案的一个简单示例:

代码语言:javascript
复制
package mcve;

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

public abstract class ComponentResizeEndListener
extends    ComponentAdapter
implements ActionListener {

    private final Timer timer;

    public ComponentResizeEndListener() {
        this(200);
    }

    public ComponentResizeEndListener(int delayMS) {
        timer = new Timer(delayMS, this);
        timer.setRepeats(false);
        timer.setCoalesce(false);
    }

    @Override
    public void componentResized(ComponentEvent e) {
        timer.restart();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        resizeTimedOut();
    }

    public abstract void resizeTimedOut();
}

然后:

代码语言:javascript
复制
comp.addComponentListener(new ComponentResizeEndListener() {
    @Override
    public void resizeTimedOut() {
        doExpensiveCalculation();
    }
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17338322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档