2 baidu 34067238 baidu_34067238 于 2016.04.21 10:17 提问

关于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/#
    }

这是我写的键盘按下的监听方法,用于重置游戏和控制坦克行动方向。现在我想做个更改键位的功能,不知道各位大神什么方法能实现。

3个回答

CSDNXIAON
CSDNXIAON   2016.04.21 10:26

基于JVM的Java静态与动态绑定实现机制
java中的动态绑定
java的动态绑定
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

w172087242
w172087242   Ds   Rxr 2016.04.21 11:26

自己写个静态管理类;
类(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,然后读写可见性放开给不同的类。

w172087242
w172087242 回复爱生活爱妮妮: 稍等
一年多之前 回复
baidu_34067238
baidu_34067238 我上面贴出的代码就是在坦克类里面的,具体要怎么改呢。大神帮帮忙
一年多之前 回复
w172087242
w172087242   Ds   Rxr 2016.04.21 16:00

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()方法
w172087242
w172087242 回复爱生活爱妮妮: 除非你逻辑写错了
一年多之前 回复
baidu_34067238
baidu_34067238 回复little_how: 并不能用
一年多之前 回复
w172087242
w172087242 如果能解决你的问题,记得一定要结帖哦...
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!