2009-12-22 3 views
8

setAccelerator()에 문제가 있습니다. 지금은 Ctrl + X를 눌러 삭제 작업을하는 코드가 있습니다. 단축키를 Shift + Delete로 설정하고 싶습니다. JMenuItem도 마찬가지입니다.JMenuItem에 대해 여러 단축키를 정의 할 수 있습니까?

JMenuItem item = new JMenuItem(menuText); 
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_X, KeyEvent.CTRL_MASK)); 
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_DELETE, KeyEvent.SHIFT_MASK)); 

을하지만 이것은 단지 시프트 + 삭제 작업을 위해 노력하고 있습니다 :

내 코드는 다음과 같다. Ctrl + X 작업을 재정의하는 것 같습니다. 이 두 가지 키 스트로크를 동시에 사용할 수 있습니까?

안내하십시오.

답변

3

은에서 : http://java.sun.com/j2se/1.4.2/docs/api/java/awt/AWTEvent.html

마스크는 AWTEventListener가 어느 쪽의 형태의 이벤트 대기 하는지를 지정하는 경우에도 사용됩니다.

그래서 두 개의 키에는 마스크를 결합 할 수 있지만 KeyEvent에는 사용할 수 없습니다.

item.setAccelerator( 
    KeyStroke.getKeyStroke(
     KeyEvent.VK_X, KeyEvent.CTRL_MASK + KeyEvent.SHIFT_MASK)); 

해결 방법 솔루션은 중앙에서의 KeyEvent를 잡을 것 (구성 요소가 해고,하지만 후 청취자가 행동하기 전에) 여부 확인의 두 가지 조합 중 하나. 그런 다음 하나의 이벤트를 실행하십시오.이 이벤트에서는 프로그래밍 방식으로 원하는 동작을 나타 내기 위해 동의합니다.

+0

PLUS가 아닌 OR 여야합니다 :'KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK' – MondKin

0

두 번째 호출이 실제로 가속기를 무시합니다. 메서드가 set로 시작하면 하나만 존재합니다. 메서드가 add로 시작하면 둘 이상의 수신기를 가질 수 있습니다 (예 : 여러 수신기의 경우).

여러 키 입력을 동일하게하려면 menuItem에 추가 된 액션 리스너를 호출하는 최상위 프레임 (또는 패널, 대화 상자 등)에 keyListener를 추가해야한다고 생각합니다.

7

예 가능합니다. 뒤에는 setAccelerator()가 단지 Key Binding을 생성하는 것입니다. 그러나 두 번째 바인딩이 첫 번째 바꿉니다.

따라서 Action (ActionListener 아님)을 만들어 메뉴 항목에 추가해야합니다. 자세한 내용은 How to Use Actions에있는 스윙 튜토리얼의 섹션을 참조하십시오. Action을 만들었으므로 Key Binding을 수동으로 생성하여 다른 KeyStroke와 Action을 공유 할 수 있습니다. 자세한 설명은 How to Use Key Bindings에있는 스윙 튜토리얼의 섹션을 참조하십시오. 또는 간단한 코드 예제를 제공하는 Key Bindings에있는 블로그를 읽을 수 있습니다.

이 두 번째 바인딩은 메뉴 항목 자체에 표시되지 않습니다.

관련 문제