を現在テスト中KeyEventDispatcher
です。
したがって、私は自分自身の
メソッドをJFrame
実装するものを少し書きました。KeyEventDispatcher
keyPressed
keyReleased
これらのメソッドでは、フラグベースのシステムを使用して、すべての矢印キーの最初のキー押下のみを検出しています。
キーを個別にクリックすると、すべてが機能します。ただし、Right、Up、Left のいずれかを離さずにクリックすると、Left キーは認識されません。
コンソール出力:
右クリック
4
上クリック
6
期待される出力:
右クリック
4
上クリック
6
左クリック
7
私のコードは次のとおりです。
メインクラス:
public class Main {
public static void main(String[] args) {
UI m = new UI();
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(m);
}
}
UI クラス:
public class UI extends JFrame implements KeyEventDispatcher{
short lurd = 0;
enum KEYSTATES{
LEFT(1),
UP(2),
RIGHT(4),
DOWN(8);
private int m_val;
KEYSTATES(int val){
m_val = val;
}
public int getm_val(){
return m_val;
}
}
public UI(){
setSize(800,600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
switch(e.getID())
{
case KeyEvent.KEY_PRESSED:
keyPressed(e);
return true;
case KeyEvent.KEY_RELEASED:
keyReleased(e);
return true;
}
return false;
}
private void keyPressed(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_LEFT && ((lurd & KEYSTATES.LEFT.getm_val()) != KEYSTATES.LEFT.getm_val())){
lurd |= KEYSTATES.LEFT.getm_val();
System.out.println("Left clicked");
System.out.println(lurd);
}
else if(e.getKeyCode() == KeyEvent.VK_UP && ((lurd & KEYSTATES.UP.getm_val()) != KEYSTATES.UP.getm_val()))
{
lurd |= KEYSTATES.UP.getm_val();
System.out.println("Up clicked");
System.out.println(lurd);
}
else if(e.getKeyCode() == KeyEvent.VK_RIGHT && ((lurd & KEYSTATES.RIGHT.getm_val()) != KEYSTATES.RIGHT.getm_val()))
{
lurd |= KEYSTATES.RIGHT.getm_val();
System.out.println("Right clicked");
System.out.println(lurd);
}
else if(e.getKeyCode() == KeyEvent.VK_DOWN && ((lurd & KEYSTATES.DOWN.getm_val()) != KEYSTATES.DOWN.getm_val()))
{
lurd |= KEYSTATES.DOWN.getm_val();
System.out.println("Down clicked");
System.out.println(lurd);
}
}
private void keyReleased(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_LEFT && ((lurd & KEYSTATES.LEFT.getm_val()) == KEYSTATES.LEFT.getm_val())){
lurd &= ~KEYSTATES.LEFT.getm_val();
System.out.println("Left released");
System.out.println(lurd);
}
else if(e.getKeyCode() == KeyEvent.VK_UP && ((lurd & KEYSTATES.UP.getm_val()) == KEYSTATES.UP.getm_val()))
{
lurd &= ~KEYSTATES.UP.getm_val();
System.out.println("Up released");
System.out.println(lurd);
}
else if(e.getKeyCode() == KeyEvent.VK_RIGHT && ((lurd & KEYSTATES.RIGHT.getm_val()) == KEYSTATES.RIGHT.getm_val()))
{
int x = ~KEYSTATES.RIGHT.getm_val();
lurd &= x;
System.out.println("Right released");
System.out.println(lurd);
}
else if(e.getKeyCode() == KeyEvent.VK_DOWN && ((lurd & KEYSTATES.DOWN.getm_val()) == KEYSTATES.DOWN.getm_val()))
{
lurd &= ~KEYSTATES.DOWN.getm_val();
System.out.println("Down released");
System.out.println(lurd);
}
}
}