题
在我的应用程序,如果组件大小予取数据。我想延迟,直到用户完成调整操作的获取。 ComponentListener
事件componentResized
触发间隔的窗口被调整大小时。
解决方案
我说你是propably写一些类型的地图应用? : - )
您可以使用Swing Timer类等到没有任何事件经过指定的时间量。下面的代码:
/** Time to wait */
private final int DELAY = 1000;
/** Waiting timer */
private javax.swing.Timer waitingTimer;
/**
* Handle resize event.
*/
public void componentResized(ComponentEvent e)
{
if (this.waitingTimer==null)
{
/* Start waiting for DELAY to elapse. */
this.waitingTimer = new Timer(DELAY,this);
this.waitingTimer.start();
}
else
{
/* Event came too soon, swallow it by resetting the timer.. */
this.waitingTimer.restart();
}
}
/**
* Actual resize method
*/
public void applyResize()
{
//...
}
/**
* Handle waitingTimer event
*/
public void actionPerformed(ActionEvent ae)
{
/* Timer finished? */
if (ae.getSource()==this.waitingTimer)
{
/* Stop timer */
this.waitingTimer.stop();
this.waitingTimer = null;
/* Resize */
this.applyResize();
}
}
其他提示
这是不可能通过常规手段,恐怕。 componentResized()
将被称为用于每个中间大小的变化,并且没有方法来确定是否当前的呼叫将是最后。
严格来说,你正在试图不是做传统的事情。数据加载可能是昂贵的IO操作,当用户更直接的用户界面操作后,希望他们如按下按钮,当适当的反馈可以显示他们的行动的结果通常是最好的执行。组件可以为无辜原因诸如帧改变的尺寸被最大化或其他地方设置作为操作的结果,如在Windows 7新的Aero操作。
一些应用程序的做强>执行IO作为上浆的结果。谷歌阅读器,例如,可以从RSS的浏览器窗口中移动滚动条的结果饲料装入旧帖子。这是一个很好的功能,并摒弃了需要明确的负载按钮,但它是直接通过寻找旧帖子的用户驱动;有意识的行动,而不是一个一个无意识
我想我的问题是,你必须非常小心你如何使这项工作。惩罚一个缓慢的IO操作,使他们只需等待,因为他们敢于调整窗口大小的用户不是用户友好的方式!
甚至,你在哪里,加载数据,所以它是一种很难回答 -您在你对你的UI是什么样子,或者是什么成分是或者它被如何调整的问题给出宝贵的小信息。这里有一些建议:我希望他们帮助
。<强> 1。将数据加载到存储器预先,只是显示它强>结果 如果数据模型是不是太大了,你可以只是把它加载到内存中,并与每一个resize事件快速重绘。事件分派线程将结合调整事件在一起,使你的听众不被请求淹没。这可能是一个非首发的你,但它是值得一提。
<强> 2。被急切装载强>结果 加载更多的数据比你需要的第一个调整大小事件,然后拒绝或缓存你不使用的数据。如果你填充表或列表的行会,这可能是更好的方法;表格数据通常是直接的加载和分析。
第3。允许在合理的时间通过调整大小以停止强>结果 第一个调整大小事件开始以1秒的倒计时计时器。任何后续调整大小事件复位1秒倒计时。在某些时候会有一个最终的resize事件之后,没有后续的resize事件重置倒计时因此被允许到期。此时计时器确实你的负担你。
三是最安全,最准确的方法,在我看来。你可以让你的应用程序通过可视化地指示数据加载在第一缩放事件感到响应,并调整计时器的倒计时让你的申请权的感觉。
这是不可能的。但是你可以使用 SingleWorkerThread 到minimalize处理的事件的数量。