我有这个简单的单例用于键盘轮询,它只实现keyListener来改变布尔的状态。我通过get getKeyListener()获取了keyListener对象。我不确定这是否可行,但代码可行。可能有更好的方法来实现这个目标吗?
更新:使用bitset
轮询键输入的更简单方法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;
}
答案 0 :(得分:0)
我认为你的单身人士没有问题我只是不确定里面的代码。
不是为Key Up / Down创建两个单独的布尔数组,而是为什么不实现KeyProcessor
。
每当收到关键事件时,将keycode
发送给Keyporcessor
,并将操作与其关联
e.g。
KeyProcessor.sendKeyEvent(keycode, PRESSED);
KeyProcessor.sendKeyEvent(keycode, RELEASED);
KeyProcessor.sendKeyEvent(keycode, TYPED);
现在创建一个命令映射,在该命令映射中,您将使用键码和&amp ;;命令。
Hashmap.put(keycode, PROCCESS_KEY_A)
enum command
{
PROCCESS_KEY_A;
pressed(){};
released(){};
typed(){};
}
sendKeyEvent
将根据从命令映射中检索到的enum
的键事件调用方法。
答案 1 :(得分:0)
我要问的第一件事是你的enum为什么不实现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) {}
}