시소당
>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을 위와같이 등록하면 실제 버튼을 누르지 않아도 원하는 효과를 얻을 수 있습니다.