隐藏组件时停止Swing计时器

mik*_*era 7 java animation swing timer

我有一个Swing计时器(javax.swing.Timer),用于在自定义Swing组件中执行一些动画.

但是,这会导致问题 - 特别是它似乎会因为活动计时器线程停止应用程序终止,即使在所有窗口关闭后也是如此.另外,当无法看到动画时,避免计时器在隐藏对象上运行的开销也会很好.

理想情况下,我想做以下事情:

  • 隐藏组件时停止计时器
  • 只要组件可见,就重新开始时间

这可能吗(当然是以线程安全的方式!)

tra*_*god 5

我对你的第一个前提持怀疑态度:这个简单的反例表明跑步javax.swing.Timer并不排除EXIT_ON_CLOSE.package-private,shared javax.swing.TimerQueue启动一个守护程序线程,允许程序退出.您可能不愿意依赖此实现细节,但可能值得寻找程序无法退出的另一个原因.

如果推迟到@kleopatra AncestorListener; 它应该允许您Timer根据需要控制.组件动画的占空比通常相当轻,并且通常由渲染主导; 当组件不可见时,后者的开销很小.可能值得进行分析以验证所提出的优化是值得的.如果是这样,请考虑使用a WindowListener来最小化非活动或图标化窗口中的活动.

附录:现在删除的答案建议覆盖setVisible()以调整计时器.虽然表面上很吸引人,但这种方法很脆弱,而且规模很小.侦听器方法利用Swing架构中常用的观察器模式.