作者h5u (h5u)
看板java
标题[请益] Java keyListener内方法的执行顺序
时间Fri Nov 6 21:56:00 2009
※ [本文转录自 Programming 看板]
作者: h5u (h5u) 看板: Programming
标题: [请益] Java keyListener内方法的执行顺序
时间: Fri Nov 6 21:52:53 2009
想请问各位先进
关於键盘事件侦测的顺序
正确按键
现在我想要用一个说明页面 ┌-------------┐-----------------┐
\/ | |
[欢迎光临...]---------->[画灰色圆]----->[变绿色]---->[不闪烁停留相同位置]
空白键(release) 停200ms 错误按键
这样我同时使用keyReleased keyTyped两者是否有时间上的冲突
因为我发现没有跟我所设定的亮起位置一致
完整程式码
http://www.badongo.com/cn/cfile/18254889
=====================部份程式码如下====================
wjp.addKeyListener(new java.awt.event.KeyAdapter(){
public void keyReleased(java.awt.event.KeyEvent e){
if (count <= trialNum) { // trial进行中
if (count == 0){ // 指导语画面
if (e.getKeyCode() == 32){
started = System.currentTimeMillis();
count = count+1; // 进行第一个trial
Graphics k = wjp.getGraphics();
k.clearRect(0, 0, width, height);
k.setColor(Color.gray);
k.fillOval(width/2-290, height/2-40, 80, 80);
k.fillOval(width/2-190, height/2-40, 80, 80);
new ThreadUtils().sleep(200);
t_1 = System.currentTimeMillis();
}
}else{
switch (pos[count-1]) {
case 1:
if (e.getKeyCode()==83){
Graphics k = wjp.getGraphics();
k.clearRect(0, 0, width, height);
k.setColor(Color.gray);
k.fillOval(width/2-290, height/2-40, 80, 80);
(略)
new ThreadUtils().sleep(200);
}
break;
case 2:
(略)
break;
}
}
// 参照pos的位置亮起
Graphics u = wjp.getGraphics();
u.clearRect(0, 0, width, height);
if (pos[count-1]==1){
u.setColor(Color.green);
} else {u.setColor(Color.gray);}
u.fillOval(width/2-290, height/2-40, 80, 80);
(略)
System.out.println("目标在"+pos[count-1]+"的位置");
switch (e.getKeyCode()){
case 83:
if (pos[count-1]==1){
t_1 = System.currentTimeMillis(); //开始计时
count = count+1;
} else {
ER[count-1] = ER[count-1]+1;
}
break;
(其他case略)
}
} else { //做完所有trial
Graphics gg = wjp.getGraphics();
gg.clearRect(0, 0, width, height);
long sum = 0;
for (int i=0; i<trialNum; ++i){
sum += RT[i];
}
String result = "平均反应时间:"+(sum/trialNum);
gg.setColor(Color.white);
gg.drawString(result, 100, 100);
stopped = System.currentTimeMillis();
System.out.print("实验总共耗时"+(stopped-started)+"毫秒");
}
};
public void keyPressed(java.awt.event.KeyEvent e){
if (e.getKeyCode()!=32){
record =System.currentTimeMillis()-t_1;
if ((count-1) <trialNum){
RT[count-1] = record;
System.out.println("第几个"+(count)+"trial,
反应时间: "+RT[count-1]);
}
}
};
});
========================
程式执行结果
555555
333331
444444
332465
664531
222134
....
指导语结束
目标在5的位置第几个1trial, 反应时间: 547
目标在5的位置第几个2trial, 反应时间: 312
目标在5的位置第几个3trial, 反应时间: 390
目标在5的位置第几个4trial, 反应时间: 391
目标在5的位置第几个5trial, 反应时间: 360
目标在5的位置第几个6trial, 反应时间: 343
目标在5的位置第几个7trial, 反应时间: 328
目标在3的位置第几个7trial, 反应时间: 1313
目标在3的位置第几个8trial, 反应时间: 344
目标在3的位置第几个9trial, 反应时间: 344
目标在3的位置第几个10trial, 反应时间: 359
目标在3的位置第几个11trial, 反应时间: 328
目标在3的位置第几个12trial, 反应时间: 360
目标在1的位置第几个12trial, 反应时间: 1063
目标在1的位置第几个13trial, 反应时间: 266
目标在4的位置第几个13trial, 反应时间: 922
........
跟设定的pos矩阵不一样
找很久还是没发现哪里出了问题....Orz
希望有好心人指点一二
感谢<(_ _)>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.123.218.22
※ 编辑: h5u 来自: 140.123.218.22 (11/06 21:55)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.123.218.22
1F:→ gatboyha: ◢███◣ 11/07 04:23
2F:→ AmosYang:(因为懒得去等那45秒)我没有看整个程式,不过,通常在 UI 11/07 20:55
3F:→ AmosYang: thread上sleep就是在自找麻烦… (但我却等了60秒推文CD) 11/07 20:57
4F:→ h5u:找到问题了!! 我把前後要抓的e.getKeyCode分开就可以了Orz 11/11 02:49