2009-08-15 32 views

回答

1

我会说你正在编写某种地图应用程序? :-)

您可以使用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(); 
    } 
} 
+0

感谢您花时间写出详细的例子;这个解决方案似乎符合我的要求。 – 2009-10-07 06:34:55

0

这是不可能的。但是您可以使用SingleWorkerThread来最小化处理事件的数量。

1

恐怕这不可能通过常规手段。每调用一次中型尺寸变化都会调用componentResized(),并且无法确定当前调用是否是最后一次调用。

严格地说,你正在尝试的不是一件传统的事情。数据加载可能是昂贵的IO操作,并且当用户在更直接的UI操作(例如按下按钮)之后期望它们时通常是最佳的,当适当的反馈可以作为其行为的结果显示时。组件可以为无辜原因诸如帧改变的尺寸被最大化或布置为操作的结果别处,例如在Windows新的Aero操作7.

一些应用执行IO作为结果的尺寸。例如,Google阅读器可以通过在浏览器窗口上移动滚动条来加载来自RSS提要的旧帖子。这是一个很好的功能,并且不需要显式加载按钮,但它是由用户寻找旧帖子直接驱动的;有意识的行动,而不是无意识的行动。

我想我的观点是,你需要非常小心你的工作方式。惩罚一个IO操作较慢的用户,使他们等待,因为他们敢于调整窗口大小,这不是一种用户友好的方法!

在你的问题中,你给出了关于你的用户界面是什么样子,或者什么是组件或者它如何调整大小的宝贵信息 - 甚至是你从哪里加载数据,因此很难回答。这里有几点建议:我希望他们帮助。

1.将数据装入内存事前,只是显示它
如果数据模型是不是太大了,你可以只是把它加载到内存中,并与每一个调整事件快速重绘。 Event-Dispatch-Thread会将调整大小的事件组合在一起,这样您的监听器就不会被请求所淹没。这对你来说可能不是首发,但值得一提。

2.渴望比你需要的第一个调整大小事件加载
加载更多的数据,然后拒绝或缓存你不使用的数据。如果你正在填充表或列表的行,这可能是更好的方法;表格数据通常是直接加载和解析的。

3.允许在合理的时间通过调整大小以停止
第一个resize事件开始以1秒的倒计时计时器。任何后续调整大小事件会重置1秒倒计时。在某一时刻,会有一个最终的调整大小事件,之后没有后续的调整大小事件重置倒计时,因此它可以过期。在这一点上,定时器会为你做好准备。

在我看来,三是最安全,最准确的方法。您可以通过可视化地指示数据在第一个调整大小事件中加载并调整计时器的倒数计时器来让应用程序感受到响应,从而获得应用程序的正确感受。

相关问题