ошибка переполнения стека при добавлении стеклянной панели в кадр - PullRequest
2 голосов
/ 23 декабря 2011

Я пытаюсь добавить универсальный щелчок правой кнопкой мыши к текстовым полям в моем приложении.Я наткнулся на решение, в котором я мог бы добавить стеклянную панель поверх рамки, сделать ее невидимой и зарегистрировать ее в качестве универсального слушателя мыши.Если компонент представляет собой текстовое поле, я показываю всплывающее меню, в противном случае я заново отправляю событие.Я вставил код ниже ...

Этот пример отлично работает.Но когда я использую это с моим приложением, я получаю ошибку переполнения стека в

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

1 Ответ

3 голосов
/ 23 декабря 2011

Я пытаюсь добавить универсальный щелчок правой кнопкой мыши к текстовым полям в моем приложении.

Оформить Global Event LIsteners .Просто проверьте источник события и выполните обработку по мере необходимости.Нет необходимости повторно отправлять события.

Обратите внимание, вы НЕ должны предполагать, что щелчок правой кнопкой мыши - это LAF-способ отображения всплывающего окна.Прочитайте раздел из учебника по Swing на Вызов всплывающего меню для лучшего решения.

...