【发布时间】: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 之后的代码靠近我的答案底部)它显示了
Timer在componentResized中的使用