0

キーボードのポーリングに使用されるこの単純なシングルトンがあります。これは、ブール値の状態を変更するためだけに 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;
}
4

2 に答える 2

0

私が最初に尋ねることは、なぜあなたの列挙型がKeyListenerインターフェイス自体を実装しないのですか? INSTANCEこれにより、コードが読みやすくなり、(もちろん以外の) statics の必要性がなくなります。

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) {}
}
于 2012-08-22T10:40:21.273 に答える
0

シングルトンに問題があるとは思いませんが、その中のコードについてはわかりません。

Key Up/Down 用に 2 つの個別のブール配列を作成するのではなく、KeyProcessor.

キーイベントが受信されるたびに、それに関連付けられたアクションとともに送信keycodeされますKeyporcessor

例えば

  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(){};
}

sendKeyEventenumコマンド マップから取得したキー イベントに基づいてメソッドを呼び出します。

于 2012-08-22T10:30:48.990 に答える