当使用ComponentListener来获得调整大小事件的通知时,如果用户将窗口角拖到新的大小,可能会得到很多事件。
现在,我需要对一个调整大小的事件进行一些昂贵的计算。如果这种情况经常发生,那就太多了。可以忽略大多数事件,只对最后一个事件做出反应(例如,如果用户释放了鼠标按钮)。问题是,我不知道如何找出上一次调整大小的事件是什么。如果我做了一个天真的方法:
this.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(final ComponentEvent e) {
if (calculationInProgress){
return;
}
calculationInProgress= true;
doExpensiveCalculation();
calculationInProgress= false;
}
});
在最后一次计算之后,窗口的大小可能会调整得更多,因此计算将不会与正确的最终尺寸相匹配。
对此有什么好的解决方案?
发布于 2018-07-06 08:38:04
下面是评论中讨论的Timer
-based解决方案的一个简单示例:
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();
}
});
https://stackoverflow.com/questions/17338322
复制相似问题