求java大神解答一下javaSE程序(我在线)

我这个程序时用键盘方向键去操作按钮的运动轨迹-----------为什么越按键盘的方向键,按钮就活动的速度越快packagea.b;importjava.awt.Flow... 我这个程序时用键盘方向键去操作按钮的运动轨迹-----------为什么越按键盘的方向键,按钮就活动的速度越快

package a.b;

import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;

//键盘事件 KeyEvent 监听器 KeyListener 注册监听 addKeyListener
public class W extends JFrame implements Runnable {

JButton btn = new JButton("小人");
int active = 2;

public W() {
this.setLayout(new FlowLayout());
this.add(btn);

btn.addKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent e) {
new Thread(W.this).start();
// 怎样判断按下的是什么键
// 要想判断上 下左右键
switch (e.getKeyCode()) {

case KeyEvent.VK_UP:
move(0);
break;
case KeyEvent.VK_DOWN:
move(1);
break;
case KeyEvent.VK_LEFT:
move(2);
break;
case KeyEvent.VK_RIGHT:
move(3);
break;
}

// System.out.println(e.getKeyCode());
// System.out.println(e.getKeyChar());

}
});

this.setBounds(100, 100, 240, 160);
this.setDefaultCloseOperation(3);
this.setVisible(true);
}

// 移动
public void move(int active) {
this.active = active;
Point p = btn.getLocation();
int x = p.x;
int y = p.y;
// 怎样判断按下的是什么键
// 要想判断上 下左右键
switch (active) {
case 0:
y -= 5;
break;
case 1:
y += 5;
break;
case 2:
x -= 5;
break;
case 3:
x += 5;
break;
}

btn.setLocation(x, y);

}

public void run() {
while (true) {
move(active);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
}
}
}

public static void main(String[] args) {
new W();
}
}
问题已解决 该问题作废
展开
 我来答
hefan82327
2014-09-30 · TA获得超过2974个赞
知道答主
回答量:236
采纳率:0%
帮助的人:128万
展开全部
new Thread(W.this).start();的位置错误

每次按键盘都创建了一个线程,导致多个线程的效果叠加,如果是单一线程,那么要隔300个毫秒移动一次,但由于多个线程效果叠加,在一个线程300毫秒没有到时,另一个线程启动并移动位置,而前一个线程300毫秒后再次移动一次位置,所以,移动一次位置的时间小于了300毫秒。看起来就越来越快。如果你能每毫秒按一次键盘的话,理论上,300毫秒,你可以启动300个线程,那么一个线程sleep一次的时候,另外299个线程已经移动了299次,你说快不?
正确做法:
1、active 初始值为-1

2、将new Thread(W.this).start();放到this.add(btn);下面,也就是说放在监听器外。

这样创建W的时候,线程已经启动,但是,由于active=-1,所以不会移动,一旦触发了键盘事件,这时active变化,那么线程的move产生位移效果。由于只有一个线程,所以,没有移动效果叠加,不会变快。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式