2011-12-23 3 views
2

내 응용 프로그램의 텍스트 필드에 보편적 인 오른쪽 클릭을 추가하려고합니다. 나는 내 프레임 위에 유리창을 추가하고 보이지 않게 만들고 보편적 인 마우스 리스너로 등록 할 수있는 솔루션을 발견했습니다. 구성 요소가 텍스트 필드 인 경우 팝업 메뉴를 표시하고, 그렇지 않으면 이벤트를 재발송합니다. 아래 코드를 붙여 넣었습니다 ...내 프레임에 유리판을 추가 할 때 stackoverflow 오류가 발생합니다.

이 예제는 잘 동작합니다. 그래도 난 내 응용 프로그램이 사용할 때, 나는 마우스가 다음 유리 창 이벤트를받는 구성 요소에 입력하고 때마다 재발송 이해

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at apple.awt.CWindow._getLocationOnScreen(Native Method) 
at apple.awt.CWindow.getLocationOnScreen(CWindow.java:878) 
at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1960) 
at java.awt.Component.getLocationOnScreen(Component.java:1938) 
at javax.swing.SwingUtilities.convertPointToScreen(SwingUtilities.java:364) 
at javax.swing.SwingUtilities.convertPoint(SwingUtilities.java:165) 
at com.aesthete.csmart.ui.common.components.RightClickGlassPane.redispatchMouseEvent(RightClickGlassPane.java:79) 
at com.aesthete.csmart.ui.common.components.RightClickGlassPane.mouseEntered(RightClickGlassPane.java:61) 

에서 유래 오류가 발생합니다. 하지만 재귀 호출로 변환되는 이유는 무엇입니까?

편집 : 나는 Camickr의 제안에 그것을 해결하는 방법을 그냥 모두를 보여주고 싶었 : 내 응용 프로그램에서 텍스트 필드에 보편적 마우스 오른쪽 버튼으로 클릭를 추가하려고

SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      final JPopupMenu popup = new JPopupMenu(); 
      JMenuItem mnItemCopy = new JMenuItem("Copy", CommonUI.getScaledImage(13, 13, "/images/copy.png")); 
      JMenuItem mnItemCut = new JMenuItem("Cut", CommonUI.getScaledImage(13, 13, "/images/cut.png")); 
      JMenuItem mnItemPaste = new JMenuItem("Paste", CommonUI.getScaledImage(13, 13, "/images/paste.png")); 
      popup.add(mnItemCopy); 
      popup.add(mnItemCut); 
      popup.add(mnItemPaste); 

      Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 
       @Override 
       public void eventDispatched(AWTEvent event) { 
        if(event instanceof MouseEvent) { 
         MouseEvent mouseevent=(MouseEvent)event; 
         if(mouseevent.isPopupTrigger()) { 
          if (mouseevent.getComponent() instanceof JTextField) { 
           popup.show(mouseevent.getComponent(), mouseevent.getX(), mouseevent.getY()); 
          } 
         } 
        } 
       } 
      }, AWTEvent.MOUSE_EVENT_MASK); 
     } 
    }); 
+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 문제가 표시되지 않은 코드를 기반으로 ** 삭제 된 게시물이 ** ** 있습니다! 혼란을 피하기 위해 같은 코드가 편집되었습니다. –

+0

감사합니다 앤드류. 잘못된 SSCCE에 대해 죄송합니다. 내 코드베이스에 게시 한 것과 동일한 클래스를 사용했습니다. 나는 그것을 추출하여 올바르게 실행되고있는 것을 보았습니다. 내 코드 기반과 통합되었을 때 왜 실패했는지 확신 할 수 없었다. 내가 가진 모든 정보를 다 줄께. – sethu

+0

다행 이군. 반대표를 반전하여 해결책을보고했습니다. –

답변

3

.

체크 아웃 Global Event LIsteners을 확인하십시오. 이벤트 소스를 확인하고 필요에 따라 처리하십시오. 이벤트를 재발견 할 필요가 없습니다.

참고 : 팝업을 표시하는 LAF 방식은 마우스 오른쪽 버튼을 클릭한다고 가정하지 마십시오. 보다 나은 해결책을 찾으려면 Swing 튜토리얼의 Bringing Up a Popup Menu 섹션을 읽으십시오.

+0

글로벌 이벤트 청취자 링크에 감사드립니다. 그게 나를 위해 해결 .. – sethu

+0

@ 앤드류 톰슨, 맞아, 나는 대답을 추가 답변을 편집했습니다. – camickr

관련 문제