2013-04-23 4 views
2

그래서 Java 클래스를위한 Swing에서 간단한 GUI를 만들어야 만합니다. 그리고이 작은 외관상의 문제를 발견했습니다.JMenuItem - 액셀러레이터에서 동작이 호출되었는지 확인하는 방법?

나는 다음과 같은 코드를 가지고 : 나는 스윙 다르게이를보고 보인다 전송으로 버튼을 1보다 다른 마우스 버튼을 사용하는 경우 마우스 오른쪽 버튼으로 클릭하거나 호출 된 메뉴 항목을 본 적이

JMenuItem mntmQuit = new JMenuItem("Quit"); 
    mntmQuit.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if (e.getModifiers() == MouseEvent.BUTTON1_MASK) { 
       System.out.println("You should fire."); 
      } else if (e.getModifiers() == MouseEvent.BUTTON2_MASK || e.getModifiers() == MouseEvent.BUTTON3_MASK) { 
       System.out.println("Why do you fire this event?"); 
      } else { 
       System.out.println("And how can I catch when the accelerator was used?"); 
      } 
     } 
    }); 
    mntmQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0)); 

을 어떤 마우스 버튼이 눌러 졌는지 상관없이 액션 이벤트 - JButton과 반대로 마우스 버튼 1을 클릭하지 않는 한 아무 것도 실행하지 않습니다.

이제는 마우스 버튼 1을 쉽게 잡아서 내 작업을 수행 할 수있게되었습니다. , 그러나 가속기의 사용법을 잡는 것은 어떨까요? 그것은 액션 이벤트를 발생시킬 것이지만, 나는 '0'을 수정 자로 반환하므로 (1, 2, 3을 제외한 다른 마우스 버튼과 동일) 잡을 수있는 가능성은 없습니다.

JMenuItem에는 마우스 버튼 1에만 반응해야한다고 말하는 방법이 있습니까? 가속기입니까? JButton과 비슷한 방식으로 작동합니까?

답변

0
JMenuItem mntmQuit = new JMenuItem("Quit"); 
    mntmQuit.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if (!(e.getModifiers() == InputEvent.BUTTON3_MASK)) { 
       System.out.println(e.getActionCommand()); 
      } 
     } 
    }); 
    mntmQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0)); 

편집 : 내가 대신 이벤트가 발생하면 검사의, 내 대답을 변경했습니다

, 당신이 그것을 실행되지시기를 확인해야한다. 따라서이 경우 Button3 또는 마우스 오른쪽 버튼을 클릭하십시오. "q"를 누르거나 마우스를 클릭하면 이벤트가 항상 실행됩니다.

이전 대답이 좋지 않았기 때문에 e.getModifiers()을 사용하고 싶지는 않습니다. 실제로 반환하지 않으려는 이벤트에 대해 true를 반환 할 수 있기 때문입니다. 예 : "q"와 "w"가 같은 버튼으로 설정되었지만 서로 다른 작업을 수행하는 경우 두 이벤트 모두 첫 번째 if 성명 검사에서 트리거됩니다. e.getModifiers() == 0

혼란스럽게 대단히 죄송합니다.

+0

답변을 주셔서 감사합니다. 그러나 올바르게 이해할 수 있을지 확실하지 않습니다. 'e.getModifiers() == KeyEvent.VK_Q'를 확인하면 작동하지 않습니다. 'e.getModifiers()가 액셀러레이터에 의해 실행되면'0 '을 반환하고 이것이 실행 된 이벤트와 구별 할 수 없기 때문이라고 생각합니다 마우스 버튼 4를 예로 들어 보겠습니다. 편집 : 죄송합니다. 첫 번째 코드 줄을 놓치 셨습니다. 그것도 생각할 만하다. 그러나 문제는 수정 자 (Modifier)가 액셀러레이터뿐만 아니라 1, 2 또는 3보다 다른 모든 마우스 버튼과 일치한다는 것이다. – user1728176

+0

@ user1728176 내 편집을 참조하십시오. – Aboutblank

관련 문제