Java 将玻璃窗格添加到框架时出现stackoverflow错误

Java 将玻璃窗格添加到框架时出现stackoverflow错误,java,swing,stack-overflow,Java,Swing,Stack Overflow,我正在尝试在我的应用程序中添加一个通用的右键单击文本字段。我遇到了一个解决方案,我可以在框架顶部添加一个玻璃窗格,使其不可见,并将其注册为通用鼠标侦听器。如果组件是文本字段,我将显示弹出菜单,否则我将重新修补事件。我已将代码粘贴到下面 这个例子很好用。但是,当我在应用程序中使用它时,在 Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError at apple.awt.CWindow._getLocationOnScr

我正在尝试在我的应用程序中添加一个通用的右键单击文本字段。我遇到了一个解决方案,我可以在框架顶部添加一个玻璃窗格,使其不可见,并将其注册为通用鼠标侦听器。如果组件是文本字段,我将显示弹出菜单,否则我将重新修补事件。我已将代码粘贴到下面

这个例子很好用。但是,当我在应用程序中使用它时,在

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);
        }
    }); 
我正在尝试在我的应用程序中添加一个通用的右键单击文本字段

退房。只需检查事件的来源,并根据需要进行处理。无需重新修补事件


注意,您不应该假设右键单击是显示弹出窗口的LAF方式。阅读Swing教程中的章节,以获得更好的解决方案。

要更快获得更好的帮助,请发布一篇文章。请注意,现在有2篇根据代码删除的帖子没有显示问题!为了避免进一步的混乱,同样的代码现在已经被删除了。谢谢安德鲁。对不起,错误的SSCCE。我使用了我在代码库中发布的同一个类。我把它提取出来,看到它运行正常。我不知道为什么它在与我的代码库集成时会失败。我想我会把我所有的信息都放进去。很高兴你把它整理好了。否决票被推翻-用于报告解决方案。@AndrewThompson,正确,我编辑了答案以添加“否”。