当我向框架添加玻璃板时出现 stackoverflow 错误

发布于 2024-12-22 23:12:24 字数 2325 浏览 1 评论 0原文

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

这个例子工作正常。但是,当我在我的应用程序中使用它时,我在 处收到 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);
        }
    }); 

I am trying to add a universal right click to textfields in my application. I came across a solution where I could add a glass pane on top my frame, make it invisible and register that as a universal mouse listener. If the component is a text field I show the pop up menu, otherwise I redispatch the event. I have pasted the code below...

This example works fine. But when I use this with my application though, I get a stackoverflow error at

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)

I understand that every time the mouse is entered on a component the glass pane receives the event and then redispatches. But why is it getting converted into a recursive call?

EDIT:
Just wanted to show everyone how I solved it with Camickr suggestion:

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);
        }
    }); 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

煮酒 2024-12-29 23:12:24

我正在尝试向我的应用程序中的文本字段添加通用右键单击。

查看全局事件监听器。只需检查事件来源并按要求进行处理即可。无需重新调度事件。

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

I am trying to add a universal right click to textfields in my application.

Check out Global Event LIsteners. Just check the source of the event and do processing as required. No need to redispatch events.

Note, you should NOT assume a right click is the LAF way to display a popup. Read the section from the Swing tutorial on Bringing Up a Popup Menu for a better solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文