2010-01-07 3 views
7

F2 키를 액셀러레이터 키로 설정 한 "rename"메뉴 항목이 있습니다. 실제로 메뉴가 표시되면 "이름 바꾸기"옆에 약간의 "F2"표시가 나타납니다.스윙 : 액셀러레이터 키로 기능 키 (F2) 설정

슬프게도, 이것은 작동하지 않습니다. 이 가속기는 응답을 트리거하지 않습니다. 단축키를 Ctrl + F2로 변경하면 작동합니다.

InpoutMpa/ActionMap을 사용해야하는 것 같습니다. 그 문제는 앱의 모든 곳에서 작동하도록 이것을 최상위 JFrame과 연결하려고합니다. 그러나 JFrame에는 getInputMap() 메소드가 없습니다.

분실.

[추가]

 ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 
    JMenuItem mi = new JMenuItem("Rename"); 
    mi.setAccelerator(ks); 
    mi.addActionListener(action); 
+1

우리에게 보여주십시오 당신이 가속기를 설정하는 데 사용 코딩! –

+3

OS/윈도우 관리자가 키 입력을 "소비"하여 실제로 Swing 응용 프로그램에 도달하지 못하게 할 수 있습니까 (예 : F2가 특별한 것으로 매핑되었지만 Ctrl-F2가 아닌 경우)? – netzwerg

답변

4

JTable가이 StartEditing 조치를 호출 F2를 사용하기 때문에이 아마 일어나고은 (내 프로그램 중 하나에 동일한 동작을보고이 그것을 추적).

몇 가지 해결책이 있습니다.

KeyStroke keyToRemove = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 

InputMap imap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
while (imap != null) 
{ 
    imap.remove(keyToRemove); 
    imap = imap.getParent(); 
} 

또는 만 표시하기 위해 테이블을 사용하는 경우, 그리고 할 계획이없는 : 가장 과감한는 (이 코드는 실제로 모든 JTables에서 매핑을 삭제하는 생각)이 입력 매핑을 제거하는 것입니다 사용자 편집이, 당신은 비 포커스 만들 수 : 완전히 다른 주제에

table.setFocusable(false); 

, 난 강력하게 당신의 메뉴 항목에 대한 AbstractAction 서브 클래스를 만드는 것이 아니라 "처음부터"을 만드는 것이 좋습니다. 매우 간단한 메뉴 설정 코드를 제공하는 것 외에도 메인 메뉴와 팝업/툴바 모두에 동일한 액션 인스턴스를 사용할 수 있으며 동시에 둘 다를 활성화/비활성화 할 수 있습니다.

4

나는 이것이 오래된 스레드라는 것을 알고 있지만 원래 포스터와 똑같은 것으로 고민하고 해결책을 찾았습니다. JFrame 자체에는 getInputMap 메서드가 없지만 루트 창에는 적용됩니다. 따라서 "getRootPane.getInputMap"을 대신 사용해야합니다.

예제 코드 :

public class ApplicationFrame extends JFrame { 
    private AbstractAction f2Action = new AbstractAction() { 
     private static final long serialVersionUID = 1L; 

     public void actionPerformed(ActionEvent e) { 
      // Do something useful 
     } 
    }; 

    public ApplicationFrame() { 

     InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     ActionMap actionMap = getRootPane().getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke("F2"), "f2Action"); 
     actionMap.put("f2Action", f2Action); 

    } 
} 
+1

음 ... 메뉴 액셀러레이터가 작동하지 않을 때이 바인딩이 작동한다고 생각하지 마십시오. – kleopatra

+0

액셀러레이터는 어딘가에 추가되는 바인딩입니다. 문제는 구성 요소 트리를 따라 무언가가 바인딩에 도달하기 전에 키 입력을 캡처한다는 것입니다. 컨테이너 트리 전체를 가로 지르는 메소드를 작성하고 찾은 JComponent의 입력 맵에서 키 스트로크를 제거하여이를 해결했습니다. –