【问题标题】:Getting the last resize event of a component获取组件的最后一个调整大小事件
【发布时间】:2013-06-24 16:04:10
【问题描述】:

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

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

this.addComponentListener(new ComponentAdapter() {
  @Override
  public void componentResized(final ComponentEvent e) {
    if (calculationInProgress){
      return;
    }

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

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

有什么好的解决办法?

【问题讨论】:

  • 使用不重复的javax.swing.Timer,延迟很短,比如 250 毫秒左右。每次调用componentResized,重启定时器。当计时器被触发时,您可以尝试开始计算。根据计算的性质,您也可以使用SwingWorker
  • @MadProgrammer 这是个好主意!谢谢你。而且效果很好。
  • 查看this 答案(UPDATE 之后的代码靠近我的答案底部)它显示了TimercomponentResized 中的使用

标签: java swing resize


【解决方案1】:

以下是 cmets 中讨论的基于 Timer 的解决方案的简单示例:

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();
}

然后:

comp.addComponentListener(new ComponentResizeEndListener() {
    @Override
    public void resizeTimedOut() {
        doExpensiveCalculation();
    }
});

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 2018-09-05
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2012-04-23
    相关资源
    最近更新 更多