2011-12-23 68 views
2

我试图在我的应用程序中添加一个通用的右键单击文本框。我遇到了一个解决方案,我可以在框架顶部添加一个玻璃窗格,使其不可见并将其注册为通用鼠标监听器。如果组件是文本字段,则显示弹出式菜单,否则我将重新分派该事件。我粘贴下面的代码...当我添加一个glasspane到我的框架时,出现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/)。请注意,根据未显示问题的代码,现在有** 2个已删除的帖子!现在已经编辑了相同的代码,以避免进一步的混淆。 – 2011-12-23 03:56:01

+0

谢谢安德鲁。抱歉,关于不正确的SSCCE。我使用了我在代码库中发布的同一个类。我解压出来,看到它正确运行。我不确定为什么在与我的代码库集成时失败。我想我会把我所有的信息。 – sethu 2011-12-23 05:22:27

+0

很高兴你把它分类。反向投票 - 报告解决方案。 – 2011-12-23 05:26:36

回答

3

我想一个通用右键单击我的应用程序添加到文本框。

结账Global Event LIsteners。只需检查事件的来源并根据需要进行处理。无需重新分派活动。

请注意,您不应该假设右键单击是LAF显示弹出窗口的方式。请参阅Bringing Up a Popup Menu的Swing教程以获得更好的解决方案。

+0

感谢Global Event Listeners链接。那为我解决了它.. – sethu 2011-12-23 05:22:49

+0

@AndrewThompson,正确的,我编辑了答案以添加NOT。 – camickr 2011-12-23 15:24:13

相关问题