在我的应用程序中,如果调整了组件大小,我将获取数据。我想延迟获取,直到用户完成调整大小操作。每次调整窗口大小时都会触发ComponentListener
事件componentResized
。
答案 0 :(得分:2)
我会说你正在编写某种地图应用程序吗? : - )
您可以使用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();
}
}
答案 1 :(得分:1)
恐怕这不可能通过传统方式实现。每次中间调整更改都会调用componentResized()
,并且无法确定当前调用是否为最后调用。
严格来说,你所尝试的并不是传统的事情。数据加载可能是昂贵的IO操作,并且当用户在更直接的UI操作(例如按钮按下)之后期望它们时,通常最佳地执行,此时可以由于其动作而显示适当的反馈。组件的大小可能因无辜的原因而发生变化,例如框架被最大化或由于其他地方的操作而被安排,例如Windows 7中的新Aero操作。
某些应用程序执行执行IO作为调整大小的结果。例如,谷歌阅读器可以通过移动浏览器窗口上的滚动条从RSS源加载旧帖子。这是一个很好的功能,并且不需要显式加载按钮,但它直接由用户寻找旧帖子驱动;一个有意识的行动,而不是一个无意识的行动。
我想我的观点是你需要非常小心你如何做这项工作。惩罚用户使用缓慢的IO操作使他们等待只是因为他们敢于调整窗口大小并不是一种用户友好的方法!
您在关于UI的外观,或者组件是什么或如何调整大小的问题中提供了一些宝贵的信息 - 即使是从哪里加载数据,也很难回答。以下是一些建议:我希望他们有所帮助。
<强> 1。事先将数据加载到内存中,只显示
如果数据模型不是太大,您可以将其加载到内存中,并在每次调整大小事件时快速重绘。 Event-Dispatch-Thread将把resize事件组合在一起,这样你的监听器就不会被请求所淹没。对你来说这可能不是首发,但值得一提。
<强> 2。急于加载
在第一次调整大小事件时加载的数据超出了您的需要,然后拒绝或缓存您不使用的数据。如果要填充表或列表的行,这可能是更好的方法;表格数据通常是直接加载和解析的。
第3。允许合理的时间通过调整大小以停止
第一次调整大小事件以1秒倒计时启动一个Timer。任何后续调整大小事件都会重置1秒倒计时。在某些时候会有一个最终的调整大小事件,之后没有后续的调整大小事件重置倒计时,因此允许它过期。此时,Timer会为您负载。
在我看来,三是最安全,最准确的方法。您可以通过在第一次调整大小事件中明显指示数据加载来使应用程序感觉到响应,并调整计时器的倒计时以使您感觉应用程序正确。
答案 2 :(得分:0)
这是不可能的。但您可以使用SingleWorkerThread来最小化处理的事件数。