Java Swing中的MouseListener有时无响应

3

我在主JFrame上实现了右键点击打开菜单监听器,除了一个问题,它都工作正常。大约每5次点击中就有1次不响应,这可能会让用户非常烦恼。以下是我的代码:

contentPane = new JPanel();
contentPane.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {

            if (e.getButton() == MouseEvent.BUTTON3) 
            {
                //Do Stuff
            }
        }
    });

你能帮助我吗?


每5个中的一个?还是每隔5个出现一次? - David B
可能是由于长时间运行的进程,导致事件分派线程无法运行? - MadProgrammer
你确定要使用 MouseEvent.BUTTON3 吗?通常右键点击不是 BUTTON2 吗? - Mike G
五个中的一个:通常工作正常,但有时候会出问题。 例如,点击8次OK,2次不行...看起来像是随机的,但这里没有随机的东西。MouseEvent.BUTTON2 是中键点击。 - DanM
@Mong134 - 你是对的,但我认为e.isPopupTrigger()是一个更好的选择。 - Nate
2个回答

10
  1. 你无法从contentPane的子组件中获取点击事件。

    我认为你的问题是你已经向你的面板添加了一些内容。当用户点击由子组件占据的区域时,该子组件会获取点击事件。

    快速解决方法:我建议你将相同的鼠标监听器添加到所有子组件中。

  2. 你没有"点击"。

    点击是指鼠标迅速按下和释放的操作。如果你不小心,你可能会得到(例如)“按下、移动、释放”而不是“点击”的事件。

    快速解决方法:改用mouseReleased事件。


我相信这就是了,因为他提到了他有一个 OpenMenu 组件。提问者必须将他的鼠标监听器添加到那个组件上。 - David B
嗯,我只看到一个面板,缺少鼠标事件。可能与正在执行的内容有关,但我认为我的答案仍然适用。 - dacwe
4
哇,谢谢你!从没想过这点。这正是我的问题所在,当我稍微移动一下时,它就无法工作了。 - DanM
不仅限于菜单,我多年来经常遇到类似的情况。如果操作者点击打开的区域,然后通过监控每次按下、释放和点击事件的x、y位置仔细观察鼠标的位置,他会注意到鼠标在按下和释放之间移动了一个或多个像素。这就使得点击的条件无效。在我目前遇到的所有这种情况中,没有一个点击失败的x、y是相同的。我的解决方案是忽略点击,并跟踪按下和释放时的x、y坐标以及它们之间的距离。仅适用于打开的区域。 - user4229245

0

使用这段代码代替原来的代码:

private MouseAdapter listener = new MouseAdapter() {

    public void mouseReleased(MouseEvent e) {
        if (downer) {
            downer = false;
            if (new Rectangle(e.getComponent().getLocationOnScreen(), e.getComponent().getSize())
                    .contains(e.getLocationOnScreen())) {
                downer = false;
                // CODE
                new Thread(new Runnable(){
                     public void run(){
                         //Your Listener code
                     }
                }).start();

                /// COde
            }
        }
    }

    boolean downer = false;

    public void mousePressed(java.awt.event.MouseEvent e) {
        downer = true;
    }
};

这段代码只有在你按下组件并释放组件的时候才会起作用,并且会为自定义任务启动一个新的线程。这应该总是有效,因为AWT线程不会被长时间的计算阻塞。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接