问题描述
- 关于java如何实现按键监听动态绑定
-
public void keyPressed(KeyEvent e) { //按键键盘监听 int key = e.getKeyCode(); switch (key) { case KeyEvent.VK_R: tc.tanks.clear(); tc.bullets.clear(); tc.trees.clear(); tc.otherWall.clear(); tc.homeWall.clear(); tc.metalWall.clear(); tc.homeTank.setLive(false); if (tc.tanks.size() == 0) { for (int i = 0; i < 20; i++) { if (i < 9) tc.tanks.add(new Tank(150 + 70 * i, 40, false, Direction.R, tc)); else if (i < 15) tc.tanks.add(new Tank(700, 140 + 50 * (i -6), false, Direction.D, tc)); else tc.tanks.add(new Tank(10, 50 * (i - 12), false, Direction.L, tc)); } } tc.homeTank = new Tank(300, 560, true, Direction.STOP, tc); if (!tc.home.isLive()) tc.home.setLive(true); new TankClient(); break; case KeyEvent.VK_RIGHT: //坦克向右 bR = true; break; case KeyEvent.VK_LEFT://坦克向左 bL = true; break; case KeyEvent.VK_UP: //坦克向上 bU = true; break; case KeyEvent.VK_DOWN://坦克向下 bD = true; break; } decideDirection();http://ask.csdn.net/# }
这是我写的键盘按下的监听方法,用于重置游戏和控制坦克行动方向。现在我想做个更改键位的功能,不知道各位大神什么方法能实现。
解决方案
基于JVM的Java静态与动态绑定实现机制
java中的动态绑定
java的动态绑定
解决方案二:
自己写个静态管理类;
类(A)里面如下部分示例(不考虑安全性):
public static int DOWN = KeyEvent.VK_DOWN;
public static int UP = KeyEvent.VK_UP;
....
然后你的类里面:
case A.DOWN:...
case A.UP :...
修改:
因为所以地方都有读写权限,所以可以如下:
A.DOWN = 修改后的键值;
....
这样就可以了。
如果需要安全,用private static,然后读写可见性放开给不同的类。
解决方案三:
Key类,包名你自己定,这个类没考虑安全性,因为可以更改,也没法定final,可以用同包去public
import static java.awt.event.KeyEvent.*;
public class Key {
/** 私有化构造 */
private Key(){}
public static int R = VK_R;
public static int UP = VK_UP;
public static int DOWN = VK_DOWN;
public static int RIGHT = VK_RIGHT;
public static int LEFT = VK_LEFT;
/**
* 重置回原来的值
*/
public static void reset(){
R = VK_R;
UP = VK_UP;
DOWN = VK_DOWN;
RIGHT = VK_RIGHT;
LEFT = VK_LEFT;
}
/**
*
* @param r -- 自定义刷新初始化的键值
* @param up -- 自定义上的键值
* @param right -- 自定义右的键值
* @param down -- 自定义下的键值
* @param left -- 自定义左的键值
*/
public static void resetKey(int r, int up, int right, int down, int left){
R = r;
UP = up;
RIGHT = right;
DOWN = down;
LEFT = left;
}
}
这个是你代码里面的改动:
public void keyPressed(KeyEvent e) { //按键键盘监听
int key = e.getKeyCode();
switch (key) {
case Key.R:
tc.tanks.clear();
tc.bullets.clear();
tc.trees.clear();
tc.otherWall.clear();
tc.homeWall.clear();
tc.metalWall.clear();
tc.homeTank.setLive(false);
if (tc.tanks.size() == 0) {
for (int i = 0; i < 20; i++) {
if (i < 9)
tc.tanks.add(new Tank(150 + 70 * i, 40, false,
Direction.R, tc));
else if (i < 15)
tc.tanks.add(new Tank(700, 140 + 50 * (i -6), false,
Direction.D, tc));
else
tc.tanks.add(new Tank(10, 50 * (i - 12), false,
Direction.L, tc));
}
}
tc.homeTank = new Tank(300, 560, true, Direction.STOP, tc);
if (!tc.home.isLive())
tc.home.setLive(true);
new TankClient();
break;
case Key.RIGHT: //坦克向右
bR = true;
break;
case Key.LEFT://坦克向左
bL = true;
break;
case Key.UP: //坦克向上
bU = true;
break;
case Key.DOWN://坦克向下
bD = true;
break;
}
decideDirection();http://ask.csdn.net/#
}
然后就是你自定义键值的类(具体实现就不写了):
直接将用户自定义好的键值放入方法Key.reset(int r, int up, int right, int down, int left)中,就改变了。
不想用自定义了,可以调用Key.reset()方法