在ActionEvents,侦听器和计时器上

时间:2014-01-26 20:16:56

标签: java swing timer

我是Java的新手,正在开发一个标准的介绍项目,它可以创建多个(< 10)定时器,每个定时器可以独立启动和停止。一旦开始,他们会从每秒一次的初始开始时间开始倒计时,显示更新等等等等。

我目前的设置正在运行,似乎符合项目的要求。我想知道总体布局,以及是否有一种更聪明的方式来接近。

目前,我有:

  • 一个等待按下任何计时器按钮的监听器。这包括“开始”,“停止”,“重置”和“输入新时间”。对于X计时器,这意味着要听4X按钮。这都是在一个包含多个if event.getSource == (thisbutton)语句的类中捕获的。
  • 一个侦听器PER TIMER,每秒执行一次“减少时间并更新显示”命令。因此,所有这些都会独立倒计时,具体取决于用户按下Start的时间。

我的教科书给出了一个分配一个监听器以查看按下哪个按钮而不是每个按钮都有一个监听器的示例,所以我在这里采用了这种方法。您希望提供任何一般性建议。

1 个答案:

答案 0 :(得分:1)

你需要问几个问题......

它的可扩展性如何?有哪些性能考虑因素?

它的可扩展性如何?

如果您查看当前的方法,则只有一个ActionListener监视所有按钮。如果您需要将Timers的数量增加到20,100,1000,会发生什么?这是一项额外的工作和非常大的if陈述。

现在,我特别关注维持责任级别,并且必须在if之内维持多级ActionListener语句,真的不喜欢这种方法......

相反,您可以将所有内容(例如按钮)放在某种List中,并在调用actionPerformed方法时循环遍历列表,但即使这样也很难管理,也可能不会从长远来看,满足您的设计要求。您可能会或不会允许ActionListener了解您的按钮,或者由于参考问题等原因您无法访问List ...

就个人而言,我会创建两个类,StartActionListenerStopActionListener。这些将引用(至少)Timer

这意味着,要添加新的开始按钮,您只需创建一个新的JButton并创建StartActionListener的新实例并注册到该按钮。您可以为停止按钮执行类似操作,向其中注册StopActionListener的实例。

这将监听器设计与应用程序设计分开,因为听众实际上根本不需要关心按钮,只有他们正在管理的Timer。这意味着每个监听器只负责一件事,并为设计提供一定程度的抽象,让您自由选择如何实际实现整体设计/要求。

您可能还希望查看How to use Actions,它提供了为操作提供配置详细信息的功能,从而更轻松地创建控件。

性能考虑因素是什么?

运行多个Timers可能无法很好地扩展,并且会在您增加数量时引入性能问题,直至UI更新开始受损。

最好使用一个Timer定期“定时”,而不是创建新的Timer,您只需将ActionListener注册到一个Timer {1}}。

这可能意味着ActionListener需要保持知道何时注册,以便它可以确定每个“tick”已经过去的时间量,但这将考虑到你试图解决的问题。同样,您可以根据ActionListener保留某种计数器。