3

我的弹出菜单有这个奇怪的错误。它很少发生,而且看似随机。问题是当我的 JPopupMenu 中有一个子菜单时 - 当我选择子菜单时,主菜单消失并且子菜单被错误地绘制(就像主菜单的缓冲区被绘制在子菜单上)。我仍然可以使用键盘导航它。

这是一些屏幕截图:这就是它的样子

替代文字

这就是出现错误时的样子:

替代文字

所以第二张图片上的故障是子菜单应该在的地方。

什么可能导致这种情况?没有抛出异常,它似乎与平台无关,所以我不知道如何缩小范围。请帮忙。

编辑下面是重现问题的 sscce:

import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Test {
    private static Popup popup;

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                showMenu(e);
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                showMenu(e);
            }

            private void showMenu(final MouseEvent e) {
                if (e.isPopupTrigger()) {
                    JPopupMenu menu = new JPopupMenu();
                    JMenu subMenu = new JMenu("SubMenu");
                    menu.add(subMenu);

                    subMenu.add("Item 1");
                    subMenu.add("Item 2").addMouseMotionListener(new MouseAdapter() {
                        @Override
                        public void mouseMoved(MouseEvent e) {
                            hidePopup();
                            // this is where I call the hide twice, in my case it was
                            // caused by some action or mouse listener calling it twice
                            hidePopup();
                            showPopup(e, frame);
                        }
                    });
                    subMenu.add("Item 3");

                    menu.show(frame.getContentPane(), e.getX(), e.getY());
                }
            }

            private void showPopup(MouseEvent e, JFrame frame) {
                PopupFactory popupFactory = PopupFactory.getSharedInstance();
                JToolTip toolTip = new JToolTip();
                toolTip.setTipText("wfkwdlpfhd ");
                popup = popupFactory.getPopup(frame, toolTip, e.getXOnScreen(), e.getYOnScreen());
                popup.show();
            }

            private void hidePopup() {
                if (popup != null)
                    popup.hide();
            }
        });

        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
4

2 回答 2

2

感谢我的一位用户,我发现了一个问题。

以防万一有人比他们应该做的更多的摆动 - 这就是发生的事情:在我的程序的一部分中,当用户移动进度条的拇指时,我在 JProgressBar 上显示一个显示位置的弹出消息。为此,我Popup使用PopupFactory. 然后,使用鼠标侦听器,我显示和隐藏弹出窗口。在我调用之后,hide()我没有设置null可能导致调用hide()两次的弹出对象,或者保持弹出来自 gc - 不确切知道。但显然这搞砸了 JPopupMenu 的弹出机制。

来自 JavaDoc 的引用Popup.hide()更好地解释了它:

隐藏和处理弹出窗口。一旦一个 Popup 被释放,你不应该再调用它的方法。已释放的 Popup 可能会被回收并在以后基于 PopupFactory 使用。因此,如果您在已释放的 Popup 上调用方法,将导致不确定的行为。

于 2010-10-10T10:44:44.297 回答
0

我不确定它是否会对您的问题有所帮助,但通常应该以这种方式添加弹出菜单:

table.setComponentPopupMenu(popup);
于 2010-10-10T09:44:56.637 回答