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 回复爱生活爱妮妮: 稍等
大约 2 年之前 回复
baidu_34067238
baidu_34067238 我上面贴出的代码就是在坦克类里面的,具体要怎么改呢。大神帮帮忙
大约 2 年之前 回复
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 回复爱生活爱妮妮: 除非你逻辑写错了
大约 2 年之前 回复
baidu_34067238
baidu_34067238 回复little_how: 并不能用
大约 2 年之前 回复
w172087242
w172087242 如果能解决你的问题,记得一定要结帖哦...
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
双按钮双事件监听机制的简单java GUI
写在前面: 前两篇博客我们分别介绍了简单java GUI的基本结构及事件监听机制。这一次我们将介绍双事件(多事件)监听机制,并引入内部类。1.设计任务设计一个GUI,包含基本组件:按钮(两个),标签(一个),随机颜色圆-面板(一个),要求点击其中一个按钮可以改变标签文字,点击另一个按钮可以改变圆的颜色,实现双事件监听。2.任务分析本任务的难度在于双事件如何同时监听。我们已经知道,要实现事件监听,就
JAVA:监控按钮的两种方法
一、监听按钮,如果点击这个按钮就传一个值出去,然后在 public void actionPerformed(ActionEvent e) 方法中去与这个值做对比, if(e.getActionCommand().equals(“值”)) 如果是这个按钮发出的值,则作出相应的操作import java.awt.*; import javax.swing.*; import java.awt.
JAVA:事件监听器之键盘监听
addKeyListener public void addKeyListener(KeyListener l)添加指定的按键侦听器,以接收发自此组件的按键事件。如果 l 为 null,则不会抛出异常并且不执行动作。 java.awt.event 接口 KeyListener 用于接收键盘事件(击键)的侦听器接口。旨在处理键盘事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象 Key
JAVA实现计算器(按键事件+点击事件,仿手机计算器)
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; impor...
java实现鼠标和键盘动作后台监听(未测试)
有的时候需要我们对鼠标和键盘的动作(鼠标的移动,键盘的点击)进行监听,比如按键记录,鼠标坐标记录等。 我们使用JNA来实现以上的操作  tips:JNA类库使用一个很小的本地类库sub 动态的调用本地代码。程序员只需要使用一个特定的java接口描述一下将要调用的本地代码的方法的结构和一些基本属性。这样就省了为了适配多个平台而大量的配置和编译代码。因为调用的都是JNA提供的公用jar 包中的接口
java 键盘监听
/** * 作者:@author ZhangShaoWen * 日期:2013-12-05 * 功能: */ package com.test; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Demo1_3 extends JFrame{ //定义变量 Mypanel2
java实现鼠标和键盘动作后台监听
有的时候需要我们对鼠标和键盘的动作(鼠标的移动,键盘的点击)进行监听,比如按键记录,鼠标坐标记录等。 我们使用JNA来实现以上的操作  tips:JNA类库使用一个很小的本地类库sub 动态的调用本地代码。程序员只需要使用一个特定的java接口描述一下将要调用的本地代码的方法的结构和一些基本属性。这样就省了为了适配多个平台而大量的配置和编译代码。因为调用的都是JNA提供的公用jar 包
HTML 对enter键做监听 (Java web)
当对input框输入参数后,有的时候希望直接按enter键就可以执行需要做的操作,这其实是对键盘的enter键做监听,具体实现如下: 首先 在Html的 中加入下面代码(这一步骤很重要) body onkeydown="enterSubmit(event)"> enterSubmit 是当按键后操作的具体实现: function enterSubmit(obj) {
JavaScript如何监听两个组合键
给文档添加事件onkeydown表示某个键盘按键被按下document.onkeydown = function(event) { //处理 }在这里需要注意document, document 是一个文档对象,使用 document 对象可以对 HTML 文档进行检查、修改或添加内容,并处理该文档内部的事件,event对象(window.event);另一个就是Event对象,代表着事件的状态
手把手教你实现Java监听器全局监控
http://www.csdn123.com/html/blogs/20130514/12650.htm 1.前段时间,闲来无聊,想做个像QQ截图一样的截图工具,在却在做的过程中发现java自带API中的监听器带有很大的局限性,java的鼠标监听器只有在鼠标在程序窗口之上时才会生效,而键盘监听器则更加局限,只有在当前窗口为焦点窗口时才会生效,这显然是不符合我们需要效果的,我们所需要的