求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();
}
}
问题已解决 该问题作废 展开
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();
}
}
问题已解决 该问题作废 展开
1个回答
展开全部
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产生位移效果。由于只有一个线程,所以,没有移动效果叠加,不会变快。
每次按键盘都创建了一个线程,导致多个线程的效果叠加,如果是单一线程,那么要隔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产生位移效果。由于只有一个线程,所以,没有移动效果叠加,不会变快。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询