javax.swing.Timer timer;
是否足以计算所用时间?我正在做一个俄罗斯方块项目,该项目还计算玩家玩游戏所需的时间。在play
方法中,
public void play() {
reset();
onPlay = true;
Thread thread = new Thread(new Game());
thread.start();
rightPanel.setPlayButtonEnable(false);
rightPanel.setPause(true);
rightPanel.setStop(true);
playItem.setEnabled(false);
pauseItem.setEnabled(true);
stopItem.setEnabled(true);
setBlockColorItem.setEnabled(false);
setBGColorItem.setEnabled(false);
rightPanel.requestFocus();
//time.start();
//timeElapsed = System.currentTimeMillis();
RightPanel.timeElapsedTextField.setText("");
timer.start();
startTime = System.currentTimeMillis();
}
在stop
方法中,
public void stop() {
isStop=true;
onPlay = false;
if (piece != null)
piece.isMoving = false;
playItem.setEnabled(true);
rightPanel.setPlayButtonEnable(true);
pauseItem.setEnabled(false);
rightPanel.setPauseButtonLabel(true);
stopItem.setEnabled(false);
resumeItem.setEnabled(false);
setBlockColorItem.setEnabled(true);
setBGColorItem.setEnabled(true);
rightPanel.setPause(false);
rightPanel.setStop(false);
reset();
//time.stop();
timer.stop();
long delta = (System.currentTimeMillis() - startTime)/10;
RightPanel.timeElapsedTextField.setText(Double.toString(delta/100.0) + " seconds");
}
这些够了吗?每当试图显示经过的时间时,JTextField都不显示任何内容。可能出了什么问题?非常感谢!
public void run() {
int column = 4, style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
//timer.start();
//startTime = System.currentTimeMillis();
while (onPlay) {
if (piece != null) {
if (piece.isAlive()) {
try {
Thread.currentThread().sleep(100);
}
catch (InterruptedException ie) {
ie.printStackTrace();
}
continue;
}
}
checkFullLine();
if (isGameOver()) {
playItem.setEnabled(true);
pauseItem.setEnabled(true);
resumeItem.setEnabled(false);
rightPanel.setPlayButtonEnable(true);
rightPanel.setPauseButtonLabel(true);
displayGameOver();
return;
}
piece = new Piece(style, -1, column, board);
piece.start();
//numDropped = numDropped+1;
//RightPanel.scoreTextField.setText(numDropped+"");
style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
rightPanel.setTipStyle(style);
numDropped = numDropped+1;
RightPanel.numDroppedTextField.setText(numDropped+"");
//RightPanel.numDroppedTextField = new JTextField(numDropped+"");
long startTime = System.currentTimeMillis();
}
long estimatedTime = ((System.currentTimeMillis() - startTime)/1000);
RightPanel.timeElapsedTextField.setText(estimatedTime+"");
}
您应该使用nanoTime()来计算经过的时间。
long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
你有一个线程正在为Game运行。我认为您应该在start of run()方法和estimatedTime end of run(()方法中计算startTime。我只能推测,因为我不知道游戏类代码。
下面是如何做到这一点的简单说明。
import java.util.concurrent.TimeUnit;
public class Demo implements Runnable {
private volatile boolean shouldRun = true;
@Override
public void run() {
long startTime = System.nanoTime();
while (shouldRun) {
// do nothing
}
long estimatedTime = System.nanoTime() - startTime;
System.out.println(TimeUnit.NANOSECONDS.toSeconds(estimatedTime));//Print apprx 5 seconds since time may be required to actually enter in to run method after start
}
public void stop() {
shouldRun = false;
}
public static void main(String[] args) throws InterruptedException {
Demo demo = new Demo();
Thread thread = new Thread(demo);
thread.start();
Thread.sleep(5000);// 5 Seconds sleep
demo.stop();// Stop the thread
}
}
tl;dr
Duration
.between(
then ,
Instant.now()
)
.toSeconds()
详细信息
Timer
不测量经过的时间。
您对System.currentTimeMillis
的调用可测量所用时间。但是这种方法在Java8及更高版本中已经过时了。相反,请使用java.time.Instant
。
Instant
表示UTC中的一个时刻,分辨率为纳秒。然而,当前传统计算机中的硬件时钟并不能准确地跟踪时间,因此Instant.now
在Java 9及更高版本中以微秒的分辨率捕捉当前时刻(仅在Java 8中为毫秒)。
Instant start = Instant.now() ;
…
Instant stop = Instant.now() ;
要表示这两个时刻之间经过的时间,请使用Duration
。
Duration d = Duration.between( start , stop ) ;
在标准ISO 8601中为经过的时间生成文本。
String output = d.toString() ;
或者询问几秒钟或诸如此类的时间。
long secondsElapsed = d.toSeconds() ;
关于java.time
java.time框架构建在Java8及更高版本中。这些类取代了诸如java.util.Date
、Calendar
和&SimpleDateFormat
。
要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。
现在处于维护模式的JodaTime项目建议迁移到java.Time类。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*
类。
从哪里获得java.time类?
- Java SE 8、Java SE 9和Java SE 10,爪哇SE 11及更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些小功能和修复程序
- Java SE 6和Java SE 7
- 大多数Java.time功能都是向后移植到Java 6&7英寸ThreeTen背包
- Android
- java.time类的Android捆绑包的后续版本
- 对于早期的Android(<26),ThreeTenABP项目适用于ThreeTen Backport(如上所述)。请参阅如何使用ThreeTenABP…
ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等等。