我有一个用于键盘轮询的简单单例,它实现keyListener只是为了更改布尔值的状态。我通过getgetKeyListener()获取keyListener对象。我不确定这是否是可行的,但代码是有效的。可能有更好的方法来实现这一点吗?
更新:使用位集轮询密钥输入的更简单方法
package Singleton;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.BitSet;
public enum bitKeyProcessor implements KeyListener{
INSTANCE;
private final BitSet bitset = new BitSet();
@Override
public void keyPressed(KeyEvent e) {
bitset.set(e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e) {
try{bitset.clear(e.getKeyCode());}
catch(Exception ex) {ex.printStackTrace();}
}
public void keyTyped(KeyEvent e) {};
public boolean isUp(){
if(bitset.get(KeyEvent.VK_UP))
return true;
return false;
}
....
public boolean isUpRight(){
if( isUp() && isRight())
return true;
return false;
}
我要问的第一件事是,为什么您的枚举不实现KeyListener
接口本身?这将使您的代码更具可读性,并消除对静态的任何需求(当然,除了INSTANCE
)。
enum eSingleton implements KeyListener {
INSTANCE;
private boolean[] keyUp = new boolean[256];
private boolean[] keyDown = new boolean[256];
private boolean listen;
public void update(){
keyUp = new boolean[256];
}
public void listen(final boolean startStop){
listen = startStop;
}
public boolean isKeyUp(int key){
return keyUp[key];
}
public boolean isKeyDown(int key){
return keyDown[key];
}
@Override
public void keyPressed(KeyEvent e) {
keyUp[e.getKeyCode()] = false;
keyDown[e.getKeyCode()] = true;
}
@Override
public void keyReleased(KeyEvent e) {
keyUp[e.getKeyCode()] = true;
keyDown[e.getKeyCode()] = false;
}
@Override
public void keyTyped(KeyEvent e) {}
}
我不认为你的单例有问题,我只是不确定里面的代码。
与其为KeyUp/Down创建两个单独的布尔数组,为什么不实现KeyProcessor
呢。
每当接收到关键事件时,将keycode
发送到Keyporcessor
,并将动作与其关联
例如
KeyProcessor.sendKeyEvent(keycode, PRESSED);
KeyProcessor.sendKeyEvent(keycode, RELEASED);
KeyProcessor.sendKeyEvent(keycode, TYPED);
现在创建一个命令映射,在该命令映射中,您将拥有使用keycode&命令
Hashmap.put(keycode, PROCCESS_KEY_A)
enum command
{
PROCCESS_KEY_A;
pressed(){};
released(){};
typed(){};
}
sendKeyEvent
将根据从命令映射中检索到的enum
的关键事件来调用方法。