【问题标题】:Ending a timer using keyadapters?使用键盘适配器结束计时器?
【发布时间】:2021-08-12 19:13:16
【问题描述】:

所以,我正在创建这个显示一个蓝色球的反应时间游戏,一旦你看到那个蓝色球,你按下向上箭头键来获取你的反应时间,一旦它变成蓝色。但是,我在创建计时器时遇到了麻烦。我希望计时器在球真正变成蓝色时启动,并希望在用户按下向上箭头后计时器结束。'

Here's an image of what I want the game to look like before the ball turns blue

and this is what I want it to look like after it turns blue, with the reaction time

这是我的代码。截至目前,一切正常,只是我需要帮助的计时器部分。我想在球变成蓝色后立即创建一个计时器,并希望该计时器在用户按下向上箭头后结束,但我只是不知道如何......

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.Timer;


public class Game extends JPanel implements KeyListener
{

private JLabel start, main, time;
private ImageIcon constant, react;

final int width = 600;
final int height = 600;

private Timer replace;


private Random random;
private int randTime;

private long startTime;
private long stopTime;
private long reactionTime;

public Game()
{
  addKeyListener(this);
  setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

setPreferredSize(new Dimension(width, height));
setBackground(Color.black);

start = new JLabel("Click Up Arrow when you see a blue ball");
start.setForeground(Color.white);
start.setAlignmentX(Component.CENTER_ALIGNMENT);
add(start);
 
constant = new ImageIcon("constantCircle.png");
main = new JLabel(constant);
main.setAlignmentX(Component.CENTER_ALIGNMENT);


randomTime();
replace = new Timer(randTime, timeListener);
replace.setRepeats(false);
replace.start();

timeTracker();
reactionTime = stopTime - startTime;
time = new JLabel("" + reactionTime);

add(time);
add(main);

}


public void randomTime()
{
  random = new Random();
  int max = 8000;
  randTime = random.nextInt(max);

}


ActionListener timeListener = new ActionListener()
{
  public void actionPerformed (ActionEvent e)
  {
    react = new ImageIcon("reactCircle.png");
    main.setIcon(react);
  
  }
};

public void timeTracker()
{
 if (replace.isRunning())
 {
   startTime = System.currentTimeMillis();
 }

}

public void keyPressed (KeyEvent e)
{  
  int key = e.getKeyCode();

  if (key == KeyEvent.VK_SPACE)
  {
    stopTime = System.currentTimeMillis();      
  }

}

public void keyReleased(KeyEvent e)
{
}

public void keyTyped (KeyEvent e)
{
}

}

【问题讨论】:

    标签: java swing timer keyboard jpanel


    【解决方案1】:

    不需要计时器。 Timer 用于以指定的时间间隔生成事件。您不知道用户何时会做出反应,因此您不能使用 Timer。

    在你的情况下,你需要做的就是:

    1. 将“startTime”变量设置为设置蓝色球图标时的当前时间。

    2. 那么您需要在按下“Up”键时设置“stopTime”变量。这时你会计算你的“reactionTime”。

    问题是您的 KeyListener 不起作用,因为 KeyEvent 仅分派给具有焦点的组件,而默认情况下 JPanel 没有焦点。

    解决方案是使用Key Bindings,而不是 KeyListener。即使面板没有焦点,也可以将 Key Binding 配置为接收 KeyEvent。

    阅读 How to Use Key Bindings 上的 Swing 教程部分了解更多信息。这个网站上也有很多使用键绑定的例子。

    【讨论】:

    • 所以我理解这个概念,但我不知道如何实际写出它的代码。我正在尝试获取按键被按下的时间,但我不知道该怎么做。我尝试使用键绑定,但我仍然感到困惑......
    • 像往常一样,每当您从简单的东西开始学习新概念时。忘记您的应用程序并学习如何使用键绑定。这意味着您需要使用 JPanel 创建一个 JFrame 并将 KeyBinding 添加到 JPanel。有 3 种不同的 InputMap。因此,请尝试 3 个 InputMap 中的每一个,看看哪个有效。整个类将有大约 20 行代码。一对夫妇创建框架。一对夫妇来创建面板。一对夫妇来创建动作。还有更多用于创建绑定。您的操作将只是显示一条消息,例如“它有效!!!”。这就是您创建minimal reproducible example 的方式。
    • 我试过了,终于成功了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2011-11-25
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多