2012-08-22 134 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