SSISO Community

시소당

Swing에서 JButton을 엔터로 누르는 방법 [InputMap ActionMap]

>JFrame에  JButton을  하나  붙였는데
>  
>마우스로  버튼을  눌러서  이벤트를  발생시키는  방법  말고
>탭으로  커서를  이동하여  버튼위에  위치했을때
>엔터를  눌러서  버튼을  누르게  하는  방법이  궁금합니다...
>  
>로그인할때  마우스로  로그인버튼  누르는  것보다
>탭한번  누르고  엔터치는  것처럼  하고  싶거든요
>  
>감사합니다.  

첫번째  방법은  JRootPane에다가  defaultButton을  등록하는  게  있습니다.  

                JButton  okButton  =  new  JButton("OK");
                ....
                JRootPane  rootPane  =  frame.getRootPane();
                rootPane.setDefaultButton(okButton);  

요렇게  하면  포커스가  어디에  있든간에  엔터를  치면  okButton이  눌려진  것과  같은  효과를  가져옵니다.
그러니까  okButton에  등록된  ActionListener들에게  ActionEvent가  모두  전달되겠죠.  

여기서  JRootPane  은  JFrame에서  가져올  수  있기  때문에  참조를  얻어오기가  좀  거시기하다거나  하면  사용하기가  번거로울  수  있습니다.  JTabbedPane에  다양한  종류의  Panel이  등록되어  있고  활성화된  Panel  마다  엔터에  대해  반응하는  버튼이  각각  존재하는  경우라든가,  뭐  이러면  사용하기가  좀  그렇죠....  

두번째  방법은  좀  복잡한데,  Key와  ActionListener를  맵핑하는  방법이  있습니다.
자세한  내용은
"How  To  Use  KeyBindings"
http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html
를  참고하시면  될겁니다.

요약하면  JComponenet에는  InputMap  과  ActionMap을  가지고  있습니다.  

InputMap은  [KeyStroke]와  [식별문자]  를  맵핑하고
ActionMap은  [식별문자]와  [javax.swing.Action]  를  맵핑합니다.  

KeyStroke에서  명시된  키가  눌리면  InputMap에서  식별문자를  가져와서  그  식별문자가  나타내는  ActionListener를  ActionMap에서  찾은후  ActionListener에게  ActionEvent를  전달합니다.  (  javax.swing.Action  이  java.awt.event.ActionListener를  상속받고  있음...)  

문서에  나온  간단한  예제가  아래와  같은데

                component.getInputMap().put(KeyStroke.getKeyStroke("F2"),
                                                        "doSomething");
                component.getActionMap().put("doSomething",
                                                          anAction);
                //where  anAction  is  a  javax.swing.Action

F2  를  누르면  InputMap에서  F2로  등록된  식별  문자인  "doSomething"을  읽어오고
ActionMap에  "doSomething"이라는  이름으로  등록된  Action이  실행되는겁니다.(없으면  말구...)
이런  식으로  버튼에  연결된  Action을  위와같이  등록하면  실제  버튼을  누르지  않아도  원하는  효과를  얻을  수  있습니다.

3168 view

4.0 stars