java - JFrame with KeyEventDispatcher Can't click 3 Arrow Keys -
i testing keyeventdispatcher.
therefore wrote little jframe implements keyeventdispatcher , own keypressed , keyreleased methods.
in methods, using flag based system detect first keypress of every arrow key.
everything works, if click keys separately. if click right, up, left (without releasing of them) left key won't recognized.
console output:
right clicked
4
clicked
6
expected output:
right clicked
4
clicked
6
left clicked
7
my code following:
main class:
public class main { public static void main(string[] args) { ui m = new ui(); keyboardfocusmanager.getcurrentkeyboardfocusmanager().addkeyeventdispatcher(m); } } ui class:
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); } } }
to solve issue, hold references of boolean variables particular keys when pressed, , make them true, , make variable false when respective key released.
here's example:
here's keypressed() method:
public void keypressed(keyevent e) { switch(e.getkeycode()) { case vk_left: setleftkeypressed(true); break; case vk_right: setrightkeypressed(true); break; case vk_up: setupkeypressed(true); break; case vk_down: setdownkeypressed(true); break; //... } printkeystates(); } and here's keyreleased() method:
public void keyreleased(keyevent e) { switch(e.getkeycode()) { case vk_left: setleftkeypressed(false); break; case vk_right: setrightkeypressed(false); break; case vk_up: setupkeypressed(false); break; case vk_down: setdownkeypressed(false); break; //... } printkeystates(); } and here's how printkeystates() method like:
public void printkeystates() { print("left", isleftkeypressed()); print("right", isrightkeypressed()); print("up", isupkeypressed()); print("down", isdownkeypressed()); } private void print(string key, boolean ispressed) { system.out.println(key + " key " + (ispressed ? "" : "not ") + "pressed."); } the boolean variables like:
private boolean isleftkeypressed; private boolean isrightkeypressed; private boolean isupkeypressed; private boolean isdownkeypressed; and setters like:
public void setleftkeypressed(boolean value) { isleftkeypressed = value; } and rest of setters...
and getters like:
public boolean isleftkeypressed() { return isleftkeypressed; } and rest of getters...
usually, in games, , in networked remote control such behavior expected, resolved through technique.
the difference in flips of boolean variables let know count of "clicks" happened key. record "click" count, can have count variables hold state of amount of clicks have happened key.
here's how can that:
int leftkeyclickcount = 0; // 0 then in setter of isleftkeypressed variable, can following:
public void setleftkeypressed(boolean value) { if(isleftkeypressed != value) { isleftkeypressed = value; ++leftkeyclickcount; } } and can other setters written...
then can print click counts of each key printing appropriate xyzkeyclickcount variable value like:
system.out.println("left key clicked: " + leftkeyclickcount + " time(s).");
Comments
Post a Comment