swing - Java Key Bindings Not Working -
i trying make key bindings in java on jpanel. want action execute when press 'w' button. follow java tutorial on making bindings, actionperformed method not execute (i.e. no text prints out). following entirety of code test gui, relevant part highlighted:
import java.awt.borderlayout; import java.awt.event.actionevent; import javax.swing.abstractaction; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.keystroke; @suppresswarnings("serial") public class test extends jframe{ private jpanel panel; public test(){ super(); setdefaultcloseoperation(jframe.exit_on_close); setsize(500,500); setlayout(new borderlayout()); setvisible(true); panel = new jpanel(); // here key bindings panel.getinputmap().put(keystroke.getkeystroke('w'),"forward"); panel.getactionmap().put("forward", new abstractaction(){ @override public void actionperformed(actionevent e){ system.out.println("test"); } }); // end of key bindings add(panel, borderlayout.center); } public static void main(string[] args){ new test(); } } the text "test" never printed. have tried many times many different variants, different keys, , make sure panel in focus, no luck. doing wrong?
the problem way in looking keystroke. keystroke.getkeystroke('w') return typed w, reason, doesn't trigger key event. why tend avoid method. instead use
panel.getinputmap().put(keystroke.getkeystroke("w"),"forward"); or
panel.getinputmap().put(keystroke.getkeystroke(keyevent.vk_w, 0),"forward"); also, may want define focus constraint inputmap, like
panel.getinputmap(jcomponent.when_in_focused_window)... would safer...but need decided @ level want key strokes triggered from
see jcomponent , how use key bindings more details
updated example
import java.awt.borderlayout; import java.awt.eventqueue; import java.awt.event.actionevent; import java.awt.event.keyevent; import javax.swing.abstractaction; import javax.swing.jcomponent; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.keystroke; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception; public class test extends jframe { private jpanel panel; public test() { super(); setdefaultcloseoperation(jframe.exit_on_close); setsize(500, 500); setlayout(new borderlayout()); setvisible(true); panel = new jpanel(); // here key bindings panel.getinputmap(jcomponent.when_in_focused_window).put(keystroke.getkeystroke(keyevent.vk_w, 0), "forward"); panel.getactionmap().put("forward", new abstractaction() { @override public void actionperformed(actionevent e) { system.out.println("test"); } }); // end of key bindings add(panel, borderlayout.center); } public static void main(string[] args) { eventqueue.invokelater(new runnable() { @override public void run() { try { uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname()); } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) { } new test(); } }); } }
Comments
Post a Comment