我想用Java创建一个简单的时钟。该代码是如此简单,我举一个例子:如何在循环中更改JLabel的文本而无需切换太快而用户无法看到它?
for(int i=0;i<=60;i++)
jLabel11.setText(Integer.toString(i));
的问题是当我跑我的程序的结果并没有显示在序列中的每个更新。 它只显示60位数字,没有显示从1到2到3的变化...
我该如何解决这个问题?
我想用Java创建一个简单的时钟。该代码是如此简单,我举一个例子:如何在循环中更改JLabel的文本而无需切换太快而用户无法看到它?
for(int i=0;i<=60;i++)
jLabel11.setText(Integer.toString(i));
的问题是当我跑我的程序的结果并没有显示在序列中的每个更新。 它只显示60位数字,没有显示从1到2到3的变化...
我该如何解决这个问题?
问题是UI的更改应该在事件分派线程上运行,但阻止此循环(并阻止UI)将停止重新绘制屏幕。相反,使用定时器来执行定期更新,例如,
Timer timer = new Timer();
ActionListener updater = new ActionListener()
{
int count;
public void actionPerformed(ActionEvent event) {
jLabel11.setText(Integer.toString(count++));
if (count==60)
timer.stop();
}
}
timer.setDelay(100);
timer.addActionListener(updater);
timer.start();
请参阅Sun教程 - How to use Swing Timers。
要明确说明是'javax.swing.Timer',而不是其他类型的'Timer'找。还要注意'javax.swing.Timer'只能用在AWT事件派发线程(EDT)上,这对我来说似乎是一个不必要的限制。 – 2010-06-16 19:51:37
@Tom Hawtin - tackline:'javax.swing.Timer'的实例使用单个线程共享一个共同的'TimeQueue';为方便起见''actionPerformed()'在EDT上运行。 – trashgod 2010-06-17 02:24:58
@trashgod我的意思是'Timer'只能在EDT上设置。 – 2010-06-17 02:44:09
如果你正在创建一个时钟,你不应该得到系统时间,而不是输出任意整数?如果您持续轮询系统时间并显示您将自动具有秒秒数字每秒更改的行为 – 2010-06-16 19:03:09