有条件的停止计时器仅在第一次有效?

2023-11-30

我正在编写一个“谁想成为百万富翁”游戏,我已经设置好了一切,只是计时器有问题。

游戏的运作方式是这样的:如果用户答对了问题,他/她就继续前进。如果没有,游戏就结束了,他们可以选择重新玩。

当游戏第一次运行时,一切正常,计时器会执行其应有的操作 - 从 30 秒开始倒计时,显示秒数。

然而,当用户单击“再次播放”按钮时,先前的计时器将继续使用新的计时器。像这样:

-timerA 距离用户失败还剩 20 秒(用 a 表示)。

-timerB 在下次玩游戏时开始(用 b 表示)。

输出:20a 29b 19a 28b 18a 27b 17a 26b ...... 2a 11b 1a 10b 9b 8b 7b 6b 5b 4b 3b 2b 1b

这是我的计时器类,名为 CountDown:

  import java.util.Timer;
  import java.util.TimerTask;

  public class CountDown {

      static Timer timer;
      public static int seconds = 30;

      public CountDown() {
          timer = new Timer();
          timer.schedule(new DisplayCountdown(), 0, 1000);
      }

      class DisplayCountdown extends TimerTask {

          int seconds = 30;

          public void run() {

                  if (seconds == 0) {
                      timer.cancel();
                      timer.purge();
                      return;
                  }

              if (seconds > 0) {
                  PlayFrame.timer.setText("" + seconds); //jLabel used to display seconds
                  seconds--;
                  if (seconds < 30) {
                      if (PlayFrame.right == true) { //check if question was answered correctly
                          System.out.print("true"); //testing purposes
                          PlayFrame.right = false;
                          PlayFrame.showQuestion();
                          PlayFrame.startTimer();
                          seconds = 0;
                          //break;
                      }
                      else if (PlayFrame.right == false) {
                          //break;
                      }
                  }      

                  else if (seconds == 0) { //if time runs out its automatic wrong answer
                      PlayFrame.wrong();
                      //break;
                  }      

                  else {
                      PlayFrame.wrong();
                      PlayFrame.timer.setText(null);
                      timer = new Timer();
                      //break;
                  }
              }
              System.out.println(seconds); // for testing purposes only
          }
      }
  }

这是我的一些 PlayFrame:

  import java.awt.Color;
  import java.util.Timer;

  public class PlayFrame extends javax.swing.JFrame {

      public static void wrong() {
          //determines which losing frame to show
          if (count <= 2){
              LossLevel0 L0 = new LossLevel0();
              L0.setVisible(true);
          }
          else if (count > 2 && count <= 6 && count != 6){
              LossLevel1 L1 = new LossLevel1();
              L1.setVisible(true);
          }
          else {
              LossLevel1 L1 = new LossLevel1();
              L1.setVisible(true);
          }
          //"supposed" to stop the timer
          CountDown.timer.cancel();
          CountDown.timer.purge();
      }

      public static void startTimer() {
          //creates new CountDown object and timer, also resets seconds
          CountDown countdown = new CountDown();
          CountDown.timer = new Timer();
          CountDown.seconds = 30;
      }

我认为当我重新启动游戏时可能会出现问题。那里唯一的代码是我在游戏开始之前将所有变量重置回其原始状态。就像这样:

    // Reset Everything
    PlayFrame.count = 0;
    PlayFrame.answer = new String();
    PlayFrame.count = 0;
    PlayFrame.right = false;
    PlayFrame.winnings = 0;
    CountDown.seconds = 30;
    CountDown.timer = new Timer();
    CountDown.timer.cancel();
    CountDown.timer.purge();

请帮忙,如果您需要更多信息,请询问!


你不应该使用java.util.Timer与 Swing 应用程序。对于这些你应该使用javax.swing.Timer因为这将尊重 Swing 事件线程。因此你的问题没有实际意义,我建议你扔掉所有的计时代码并尝试正确的计时器。您可以在这里找到教程:Swing 定时器教程

接下来,您需要删除代码正在使用的所有静态方法和字段,并将它们更改为实例字段和方法。

在 JLabel 中显示剩余时间的 Swing Timer 示例:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class TimerExample {

   private static void createAndShowGui() {
      Gui mainPanel = new Gui();

      JFrame frame = new JFrame("TimerExample");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class Gui extends JPanel {
   private static final long serialVersionUID = 1L;
   private static final String PRESS_BUTTON = "Press Button ";
   private static final String PRESS_BUTTON_AGAIN = "Press Button Again Within %02d Seconds!";
   private static final String YOU_LOSE = "You Lose!";
   private static final String YOU_WIN = "You Win!";
   private static final int PREF_W = 250;
   private static final int PREF_H = 100;
   private static final int TOTAL_SECONDS = 20;
   private static final int ONE_SECOND = 1000;

   private int elapsedSeconds = 0;
   private JLabel timerLabel = new JLabel(PRESS_BUTTON);
   private JButton button = new JButton("Button");
   private Timer myTimer;

   public Gui() {
      JPanel btnPanel = new JPanel();
      btnPanel.add(button);

      setLayout(new BorderLayout());
      add(btnPanel, BorderLayout.CENTER);
      add(timerLabel, BorderLayout.SOUTH);

      button.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            if (myTimer != null && myTimer.isRunning()) {
               myTimer.stop();
               myTimer = null;
               timerLabel.setText(YOU_WIN);               
            } else {
               elapsedSeconds = 0;
               myTimer = new Timer(ONE_SECOND, new TimerListener());
               myTimer.start();
               String text = String.format(PRESS_BUTTON_AGAIN, TOTAL_SECONDS); 
               timerLabel.setText(text);
            }
         }
      });
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         elapsedSeconds++;

         if (elapsedSeconds == TOTAL_SECONDS) {
            myTimer.stop();
            timerLabel.setText(YOU_LOSE);
         } else {
            String text = String.format(PRESS_BUTTON_AGAIN, TOTAL_SECONDS - elapsedSeconds);
            timerLabel.setText(text );
         }
      }
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有条件的停止计时器仅在第一次有效? 的相关文章

随机推荐

  • Google Charts:如何将参数传递到回调(JavaScript)?

    我有以下代码 google charts setOnLoadCallback drawChart function drawChart 我需要将一个名为chartID 的参数传递到drawChart 函数中 我该怎么做 似乎谷歌图表不想获得
  • 使用 C# 从 Excel 电子表格读取/写入

    我需要编写一个程序 将一些数据写入 Excel 电子表格 每行包含名字 姓氏 电话号码 电子邮件等基本内容 每个类别都在自己的列中 我什至不知道从哪里开始 如果有人可以告诉我要参考哪些程序集 或者向我指出一个网站或一本涵盖通过 C 程序从
  • Angular 5 http 删除不起作用

    我正在尝试使用 http delete 删除一篇文章 但 Angular 没有发出请求 我不确定缺少什么 博客服务 ts import Injectable from angular core import HttpClient from
  • sys.getrefcount 延续

    链接文本 我明白了引用计数的概念 因此 当我执行 del astrd 时 引用计数降至零并且 astrd 被 gc 收集 这是示例代码 这些代码是我在昨天的问题之后开发的 链接文本 one py def abc print Hello pr
  • 即使查询有效,mysqli_fetch_array 也会出错;将总导出作为 NULL 值运行

    我有以下查询 该查询在查询数据库时有效 EDIT 3 根据 Joe Swindell 的建议 可能是查询中的 SET runningTotal 0 行 要解决的问题是找到一种方法将下面的复杂查询转换为 JSON 字符串 该字符串也将保存 N
  • 过滤 LogCat 以仅获取来自 Android 中的“我的应用程序”的消息?

    我观察到 当我将 Logcat 与 Eclipse 和 ADT for Android 一起使用时 我也会从许多其他应用程序收到消息 有没有办法过滤此内容并仅显示来自我自己的应用程序的消息 注 以下答案已有 10 多年历史 这可能不再是最好
  • 以干净的 Ansible 格式显示调试输出

    我正在尝试在 Ansible 中以良好的格式显示调试命令的消息输出 目前输出如下 TASK stop Report Status of Jenkins Process ok localhost gt msg Service Jenkins
  • 如何使用 Python 将文本文件转换为 Excel

    我在名为 DOT 的文件夹中有一个文本文件 textfile txt 我正在尝试使用 Python 代码将该文件转换为 Excel 文件 Excelfile xls 我不熟悉Python 但根据其他评论 我写了下面的代码 该代码不起作用 谁
  • 如何使用 Mercurial 保存用户名和密码?

    我在个人项目中使用了 Mercurial 每次想要将某些内容推送到服务器时 我都会输入用户名和密码 我尝试将以下内容添加到 hgrc文件在我的主目录中 但它似乎被完全忽略了 ui username MY USER NAME password
  • 将 pandas 数据帧作为参数传递到 python subprocess.Popen

    我正在尝试从主脚本调用 python 脚本 我只需要从主脚本中生成一个数据帧 然后将其作为在子进程内使用的参数传递给子进程脚本 以下是我尝试编写所需的 python 主脚本 from subprocess import PIPE Popen
  • 具有 json 数据源的 jQuery UI Datepicker 中的事件

    我想在 jQuery UI Datepicker 中显示事件 我希望有事件的日子的样式与没有事件的日子不同 并且我想在将鼠标悬停在有事件的日期时显示带有事件详细信息的自定义工具提示 问题的解答 jQuery UI Datepicker 与
  • Java 1.8.0 在 JDBC 连接中启用 TLS1.2

    我有一个已更新到最新补丁包的 SQL Server 2014 12 0 5207 在该环境中 唯一启用的协议是 TLS1 2 已为此目的设置注册表项 我可以使用 Management Studio 在本地和远程使用 SA 帐户连接到 SQL
  • HTML 中 id 和 name 属性的区别

    两者有什么区别id and name属性 它们似乎都具有提供标识符的相同目的 我想知道 特别是关于 HTML 表单 是否有必要或出于任何原因鼓励使用两者 The name属性在表单提交中发送数据时使用 不同的控件响应不同 例如 您可能有几个
  • QFile::copy 静态函数不复制文件

    我想复制一个文本文件QFile用这个代码 void MainWindow on pushButton 4 clicked QFile copy C p text txt C p text1 txt 当我构建它时 我没有收到任何错误 但是当我
  • 自定义 Laravel 验证消息

    我正在尝试在 Laravel 5 中创建用于验证的自定义消息 这是我迄今为止尝试过的 messages required gt Harap bagian attribute di isi unique gt attribute sudah
  • SQL Server 中的程序集定期卸载并重新加载

    SQL Server 不断加载和卸载我的程序集 将它们标记为不安全 任何想法为什么会这样做 我将日志文件附在下面 由于日志中所述的确切原因 正在卸载程序集 内存压力 您无法采取任何具体措施来防止这种情况 即没有选项来禁用此行为 您最多能做的
  • 无法在 Jupyter 的 PDF 输出中显示 Unicode 字符(如 λ)

    我正在使用 Juliajupyter notebook 我想为我的工作结果生成一个 pdf 文件 但是 在生成 pdf 时 的数学表达式 3丢失 因此 pdf 中的输出是 3 这是jupyter笔记本代码 In 1 3 Out 1 3 这是
  • C++11(本机代码)与 Java(字节码)[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 最近我一直在思考本机码和字
  • Y appium 在 ios 模拟器中循环重启应用程序?

    我尝试运行测试 ipa 但是 appium 会循环重新启动应用程序并产生此错误 INST STDERR 仪器跟踪错误 目标运行失败 无法查找已启动进程的 pid 我应该如何诊断根本原因并解决问题 在 Xcode gt Derived Dat
  • 有条件的停止计时器仅在第一次有效?

    我正在编写一个 谁想成为百万富翁 游戏 我已经设置好了一切 只是计时器有问题 游戏的运作方式是这样的 如果用户答对了问题 他 她就继续前进 如果没有 游戏就结束了 他们可以选择重新玩 当游戏第一次运行时 一切正常 计时器会执行其应有的操作