2012-08-22 101 views
0

我有这个简单的单身用于键盘轮询,它实现keyListener只是为了改变布尔的状态。我通过get getListener()获取keyListener对象。我不确定这是否可行,但代码是有效的。可能有更好的方法来完成这个?枚举单例实现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; 
} 
+1

那么代码看起来对我来说还不错,Joshua Bloch肯定会喜欢使用枚举来创建一个Singleton。 –

+0

为什么???!带有实例字段的普通旧类有什么问题? (另外,我不认为在关键代码上有任何指定的有限范围。IIRC,Solaris上的数字键盘输入键用于给出相当高的值。 –

回答

0

我会问的第一件事是为什么你的枚举不实现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) {} 
} 
0

我不认为这是你的单身问题,我只是不知道它里面的代码来查询键输入。

而不是为Key Up/Down创建两个单独的布尔数组,为什么不实现KeyProcessor

每当收到关键事件发送到keycodeKeyporcessor相关联的行动与它

例如

KeyProcessor.sendKeyEvent(keycode, PRESSED); 
    KeyProcessor.sendKeyEvent(keycode, RELEASED); 
    KeyProcessor.sendKeyEvent(keycode, TYPED); 

现在创建一个命令地图中,你将有哈希映射使用的键码&命令构建键。

Hashmap.put(keycode, PROCCESS_KEY_A) 

enum command 
{ 
PROCCESS_KEY_A; 
pressed(){}; 
released(){}; 
typed(){}; 
} 

sendKeyEvent将基于从命令映射中检索到的enum的键事件调用方法。

+0

我明白你的意思,但我不明白你的意思代码,你能解释一下吗?这种方式比我拥有的更好吗? – EdQ3