解决JAVA键盘监听的延迟现象以及八个方向的运动

首先解释一下键盘出现延迟的原因:

其实键盘为了用户体验,在按下一次按键之后,会有片刻的延迟,为什么会这样呢?

你想一下,当你打一个字母时,连着出来了好几个字母,你心里面的感受是怎么样的?

所以嘛,键盘还是很人性化的。

知道问题所在,那就说解决办法吧,用boolean就可以解决这个问题,

比如刚开始设置一个UP = false;

当UP = true时,让物体运动;

当按下上键时,把UP = true;

当松下上键时,把UP = false;

这样的话延迟岂不是解决了,只要你不松上键,UP 就一直为true,物体就一直运动;

写了个小例子,可以控制物体的八个方向的运动:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyGame extends JPanel{
	JFrame frame;
	int x = 10;
	int y = 10;
	int width = 50;
	int height = 50;
	int step = 5;
	boolean U=false,D=false,L=false,R=false;
	MyGame(){
		frame = new JFrame();
		frame.setSize( 800, 600);
		frame.setLayout(null);
		
		this.setLayout(null);
		this.setBackground(Color.blue);
		this.setBounds(0, 0, 800, 600);
		this.setFocusable(true);
		
		this.addKeyListener(new Mykey());
		
		frame.add(this);

		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		new MyGame();
	}
	
	public void paint(Graphics g){
		super.paint(g);
		g.setColor(Color.YELLOW);
		g.fillOval(x, y, width, height);
		repaint();
		run();
		try {
			Thread.sleep(20);
		} catch (InterruptedException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
	
	public void run(){
		if(!U&&!D&&L&&!R){
			x-=step;
		}else if(!U&&!D&&!L&&R){
			x+=step;
		}else if(U&&!D&&!L&&!R){
			y-=step;
		}else if(!U&&D&&!L&&!R){
			y+=step;
		}else if(U&&!D&&L&&!R){
			x-=step;
			y-=step;
		}else if(!U&&D&&L&&!R){
			x-=step;
			y+=step;
		}else if(U&&!D&&!L&&R){
			x+=step;
			y-=step;
		}else if(!U&&D&&!L&&R){
			x+=step;
			y+=step;
		}
	}
	
	class Mykey extends KeyAdapter{
		@Override
		public void keyTyped(KeyEvent e) {
			// TODO 自动生成的方法存根
		}
		@Override
		public void keyPressed(KeyEvent e) {
			// TODO 自动生成的方法存根
			switch (e.getKeyCode()) {
			case KeyEvent.VK_LEFT:
				L=true;
				break;
			case KeyEvent.VK_RIGHT:
				R=true;
				break;
			case KeyEvent.VK_UP:
				U=true;
				break;
			case KeyEvent.VK_DOWN:
				D=true;
				break;
			}
			if(x<=0) L = false;
			else if(x>=700) R = false;
			if(y<=0) U = false;
			else if(y>=490) D = false;
		}

		@Override
		public void keyReleased(KeyEvent e) {
			// TODO 自动生成的方法存根
			switch (e.getKeyCode()) {
			case KeyEvent.VK_LEFT:
				L=false;
				break;
			case KeyEvent.VK_RIGHT:
				R=false;
				break;
			case KeyEvent.VK_UP:
				U=false;
				break;
			case KeyEvent.VK_DOWN:
				D=false;
				break;
			}
		}
	}
}

如果遇到闪烁现象,请看http://blog.csdn.net/sangjinchao/article/details/53052897

共勉~

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值