Java 象棋秒表不规则工作

Java 象棋秒表不规则工作,java,swing,timer,Java,Swing,Timer,我下棋的计时器有问题。它工作得很好,除了2:00>1:58>1:56等时间点2秒对2秒。。但这是1秒的间隔,而不是2秒的间隔 下面是我定义、启动和结束计时器的代码: private void setTime(){ totalTime=20; whiteSec=0; whiteMin=totalTime; blackSec=0; blackMin=totalTime; ActionListener taskPerformer = new Action

我下棋的计时器有问题。它工作得很好,除了2:00>1:58>1:56等时间点2秒对2秒。。但这是1秒的间隔,而不是2秒的间隔

下面是我定义、启动和结束计时器的代码:

private void setTime(){
    totalTime=20;
    whiteSec=0;
    whiteMin=totalTime;
    blackSec=0;
    blackMin=totalTime;
    ActionListener taskPerformer = new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
              if(whiteActive){
                  if(whiteSec>0) whiteSec-=1;
                  else{
                      whiteMin-=1;
                      whiteSec=60;
                  }
                  if(whiteMin==0 && whiteSec==0) endGame();
                  else GUI.setPlayerTime(whiteMin, whiteSec);
              }else{
                  if(blackSec>0) blackSec-=1;
                  else{
                      blackMin-=1;
                      blackSec=60;
                  }
                  if(blackMin==0 && blackSec==0) endGame();
                  else GUI.setPlayerTime(blackMin, blackSec);
              }
          }
      };
    chessTimer = new Timer(1000, taskPerformer);
}
//开始

whiteActive = true;
setTime();
wCastling = true;
bCastling = true;
canEnPassant = false;
GUI.setPlayerTime(whiteMin, whiteSec); //this writes the time in some JLabels.
guiRefresh();
activePiece = null;
chessTimer.start();
//结束

private void endGame(){
    GUI.endGame(checkMate);  //shows an endgame JOptionPane
    chessTimer.stop();
}

我将感谢任何帮助

from:此类不提供实时保证:它使用Object.waitlong方法调度任务。

from:此类不提供实时保证:它使用Object.waitlong方法调度任务。

虽然我认为计时器不能启动两次,但对setTime的多次调用将创建多个计时器,每个字段都会独立地递减字段,直到第一个字段被垃圾收集,这可能发生,也可能不会发生。如果连续调用该方法两次,两个计时器对象将共存一段时间,并且可能每秒递减两次;呼叫stop将停止其中一个计时器,并保持另一个计时器在附近

作为调试步骤和良好实践,在创建新计时器之前,请检查您是否还没有计时器:

/* ... */
if (chessTimer != null) throw new IllegalStateException("setTime already called");
chessTimer = new Timer(1000, taskPerformer);

修复它,通过使用ChestTime.Curt;p> 虽然我不相信一个计时器可以启动两次,但对setTime的多次调用将创建多个计时器,每个计时器将独立地递减字段,直到第一个字段被垃圾收集,这可能会发生,也可能不会发生。如果连续调用该方法两次,两个计时器对象将共存一段时间,并且可能每秒递减两次;呼叫stop将停止其中一个计时器,并保持另一个计时器在附近

作为调试步骤和良好实践,在创建新计时器之前,请检查您是否还没有计时器:

/* ... */
if (chessTimer != null) throw new IllegalStateException("setTime already called");
chessTimer = new Timer(1000, taskPerformer);

修复它,通过使用ChestTime.Curt;p> 此外,你最好用白时间;并将分/秒逻辑封装在一个类中。您是否对这段代码进行了调试,以确保它不会每秒被调用两次?也许你的油漆只会每2秒刷新一次?我正计划在我能正常工作的时候就这样做:P尝试手头上的所有东西,然后我将其正确封装。。我不知道这是否是最好的选择,但我对对象相对来说是新的,所以我只是尽我所能不能在1赫兹的频率下复制;请编辑您的问题,以包含显示您描述的问题的。您可以在java.swingx.Timer上调用restart以再次启动。我真的很难看到这里的问题,除了通话中的延迟等,你的一个例子,比如一个简单的计时器,从给定的时间倒计时,可能会发出更多的光。此外,你最好使用whiteTime.decrease1Sec;并将分/秒逻辑封装在一个类中。您是否对这段代码进行了调试,以确保它不会每秒被调用两次?也许你的油漆只会每2秒刷新一次?我正计划在我能正常工作的时候就这样做:P尝试手头上的所有东西,然后我将其正确封装。。我不知道这是否是最好的选择,但我对对象相对来说是新的,所以我只是尽我所能不能在1赫兹的频率下复制;请编辑您的问题,以包含显示您描述的问题的。您可以在java.swingx.Timer上调用restart以再次启动。我真的很难看出这里的问题,除了通话中的延迟等,你的一个例子,比如一个简单的计时器,从给定的时间倒计时,可能会发出更多的光我同意他不应该这样做,但这并不能解释为什么计数器每次减少两个。我编辑了这个问题,添加了我最初调用定义计时器的函数的地方的代码,以及当我停止计时器时的代码,如果它有任何帮助的话。这个问题指的是javax.swing.timer,而不是java.util.timer;还可以看到这一点。我同意他不应该这样做,但这并不能解释为什么计数器每次减少两个。我编辑了这个问题,在我最初调用定义计时器的函数的地方添加了代码,当我停止计时器时,如果有帮助的话,这个问题涉及javax.swing.timer,不是java.util.Timer;另请参见此内容。javax.swing.Timer的多个实例使用单个共享线程执行等待。@trashgod它们确实共享同一个线程,但每个计时器将分别触发其事件。SSCCE:为什么不在答案中包括您的SSCCE?我不认为这是原因,但它可以提供一些见解+1表示消息格式。我猜在管理whiteActive时出现了一个逻辑错误。实际上是对setTime的2do调用。。我发现这不太可能发生,因为我在一个方法中调用了它,该方法在一个单例类的构造函数中被调用了一次。。不走运


我,我有相同的方法-调用setTime的方法-作为public,我从主类调用它。。我的主类所做的就是创建singleton类的一个实例。。叫那该死的方法哈哈哈。。我已经有好几年没碰过主课了。。月。最坏的情况是不幸。@IñakiGuastalli很高兴帮助你!如果它解决了你的问题,请告诉我。节日快乐!javax.swing.Timer的多个实例使用一个共享线程执行等待。@trashgod它们确实共享同一个线程,但每个计时器将分别触发其事件。SSCCE:为什么不在答案中包括您的SSCCE?我不认为这是原因,但它可以提供一些见解+1表示消息格式。我猜在管理whiteActive时出现了一个逻辑错误。实际上是对setTime的2do调用。。我发现这不太可能发生,因为我在一个方法中调用了它,该方法在一个单例类的构造函数中被调用了一次。。Buuut,不幸的是,我有相同的方法-调用setTime的方法-作为public,我是从主类调用它的。。我的主类所做的就是创建singleton类的一个实例。。叫那该死的方法哈哈哈。。我已经有好几年没碰过主课了。。月。最坏的情况是不幸。@IñakiGuastalli很高兴帮助你!如果它解决了你的问题,请告诉我。节日快乐!