Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 黑莓秒表的实现_Java_User Interface_Blackberry_Multithreading_Stopwatch - Fatal编程技术网

Java 黑莓秒表的实现

Java 黑莓秒表的实现,java,user-interface,blackberry,multithreading,stopwatch,Java,User Interface,Blackberry,Multithreading,Stopwatch,我正在尝试编写一个黑莓应用程序,它基本上是一个秒表,并显示圈速。首先,我不确定我是否以最佳方式实现了秒表功能。我有一个LabelField(_myLabel),显示从00:00开始的“时钟”。然后点击开始按钮,每隔一秒钟,_myLabel字段就会更新自上次更新以来已过的秒数(应该只增加1,但有时会有延迟,它会跳过一个数字)。我只是想不出一种不同的方法来实现它——我对GUI开发和线程还不熟悉,所以我想这就是原因 编辑:以下是所谓的秒表: _timer = new Timer(); _timer.s

我正在尝试编写一个黑莓应用程序,它基本上是一个秒表,并显示圈速。首先,我不确定我是否以最佳方式实现了秒表功能。我有一个LabelField(_myLabel),显示从00:00开始的“时钟”。然后点击开始按钮,每隔一秒钟,_myLabel字段就会更新自上次更新以来已过的秒数(应该只增加1,但有时会有延迟,它会跳过一个数字)。我只是想不出一种不同的方法来实现它——我对GUI开发和线程还不熟悉,所以我想这就是原因

编辑:以下是所谓的秒表:

_timer = new Timer();
_timer.schedule(new MyTimerTask(), 250, 250);  
这是TimerTask:

class MyTimerTask extends TimerTask {
long currentTime;
long startTime = System.currentTimeMillis();

public void run() {
synchronized (Application.getEventLock()) {
currentTime = System.currentTimeMillis();
long diff = currentTime - startTime;
long min = diff / 60000;
long sec = (diff % 60000) / 1000;
String minStr = new Long(min).toString();
String secStr = new Long(sec).toString();

if (min < 10)
 minStr = "0" + minStr;
if (sec < 10)
 secStr = "0" + secStr;

 _myLabel.setText(minStr + ":" + secStr);  
timerDisplay.deleteAll();
timerDisplay.add(_timerLabel);
 }
 }
}
类MyTimerTask扩展了TimerTask{
长时间;
long startTime=System.currentTimeMillis();
公开募捐{
已同步(Application.getEventLock()){
currentTime=System.currentTimeMillis();
长差异=当前时间-开始时间;
长最小值=差值/60000;
长秒=(差值%60000)/1000;
字符串minStr=new Long(min).toString();
字符串secStr=新长(秒).toString();
如果(最小值<10)
minStr=“0”+minStr;
如果(第10节)
secStr=“0”+secStr;
_myLabel.setText(minStr+“:”+secStr);
timerDisplay.deleteAll();
timerDisplay.add(_timerLabel);
}
}
}
无论如何,当您停止秒表时,它会更新圈速数据的历史表。当此列表变长时,计时器开始降级。如果你试图滚动,那么它会变得非常糟糕

有没有更好的方法来实现我的秒表

以下是一些提示:

  • 跟踪用于更新标签的最后一个“秒”值,如果新计算的“秒”值相同,则立即退出运行循环-否则您将不必要地使用相同的值刷新UI,这会降低速度
  • 删除运行循环中的同步,只需将修改UI的代码(setText调用)放入UiApplication.getUiApplication.invokeLater()调用中(使用匿名Runnable)
  • 不要从屏幕或maanger中删除“重新添加标签”,只需调用setText(),它应该会更新-如果不更新,则在字段上调用invalidate(),它将被重新绘制
  • 现在,您已经优化了代码并最小化了实际的UI绘图量,可以安全地将timertask间隔设置为较低的值,例如50ms,这样您就可以进行更平滑的计时器更新

在创建快速用户界面时,最重要的一点是只在需要时更新用户界面,并且只更新需要更改的字段。如果调用deleteAll()之类的方法,则整个屏幕或管理器的刷新速度会非常慢。

是否每1000毫秒安排一次此时间任务?抱歉,忘了添加该部分。我会更新信息的。非常感谢!!我用你所有的建议修改了它,它工作得更好!!!