当前位置: 首页 > 知识库问答 >
问题:

使用密钥适配器结束计时器?

卫梓
2023-03-14

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

这是一张我希望在球变蓝之前比赛的画面

这就是我希望它变蓝后的样子,有反应时间

这是我的密码。到目前为止,一切都很好,这只是计时器的一部分,我需要帮助。我想创建一个计时器,只要球变成蓝色,并希望计时器结束,一旦用户按下向上箭头,但我只是不知道如何。。。

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)
{
}

}

共有1个答案

濮阳功
2023-03-14

不需要计时器。计时器用于在指定的时间间隔生成事件。你不知道用户什么时候会做出反应,所以你不能使用计时器。

在您的情况下,您需要做的是:

>

然后,当按下“Up”键时,需要设置“stopTime”变量。此时,您将计算“反应时间”。

问题是您的KeyListener不工作,因为KeyEvent只被调度到具有焦点的组件,而默认情况下JPanel没有焦点。

解决方案是使用键绑定,而不是键侦听器。即使面板没有焦点,也可以将键绑定配置为接收KeyEvent。

有关更多信息,请阅读Swing教程中有关如何使用键绑定的部分。这个网站上还有很多使用键绑定的示例。

 类似资料:
  • 我有java REST应用程序,我希望通过keycloak保护。我做了一些测试,应用程序与keycloak servlet过滤器配合良好,但我在Spring Security适配器方面遇到了问题。 钥匙斗篷。json(删除值) 可见,我只需要承载授权,若请求包含有效令牌,那个么若不是http 401,那个么我希望是http 200。我使用了以下xml配置: 到底发生了什么?请求经过身份验证,但成功

  • 我只是写了一些小代码试图让我的KeyEvent管理器工作。 正如你所见,我创建了一个JFrame并添加了gameComponent,它是Game类的一个对象。我将JPanel设置为可调焦,并请求调焦。然后将名为TAdapter的KeyAdapter设置为KeyAdapter。您可以在代码的最底层看到该类,它扩展了KeyAdapter和方法keyPressed()。 我告诉程序在按下一个键时将“按下

  • 适配器是一种特殊的库,它有一个父类和任意数量的子类。子类可以访问其父类元素,但不能访问其兄弟类的元素。在你的控制器中,适配器为类库提供了一种优雅的语法,因此类库会就此获益甚至会需要分解成离散的类。 适配器的源文件存放在system/libraries 目录下, 命名一个和类名字相同的文件夹,文件夹下存放该类。同时在该文件夹中,有一个子文件夹叫做 drivers在其中包含了所有的子类。 要使用一个适

  • 我有一个和这里完全相同的问题:spring boot-KeyCloak指向403被禁止但是,这个问题的答案说角色可能没有在KeyCloak服务器中配置或分配,这就是我的情况。 使用keycloak服务器对用户进行身份验证的一个有角度的前端应用程序。 然后将接收到的令牌传递给使用keycloak-spring-boot-2-starter使用spring-boot开发的rest服务。 这就是问题所在

  • 1. 适配器(Adapter) Intent 把一个类接口转换成另一个用户需要的接口。 Class Diagram Implementation 鸭子(Duck)和火鸡(Turkey)拥有不同的叫声,Duck 的叫声调用 quack() 方法,而 Turkey 调用 gobble() 方法。 要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法,从而让火鸡冒充

  • 问题内容: 马克·墨菲(Mark Murphy)在他的博客上很好地说明了应将哪些信息排除在公共存储库之外。密钥材料(例如用于各种服务的OAuth密钥或API密钥)就是一个很好的例子。 有问题的应用程序将是移动android应用程序,因此有人对其进行反编译以获取秘密密钥不在此问题范围内。 如何配置公共CI实例(例如cloudbees)上的构建作业,以使机密不泄漏到构建日志或编译目录中?我的主要目的是