当前位置: 首页 > 知识库问答 >
问题:

双击也触发单次单击在java.awt.event.鼠标适配器

荣波
2023-03-14

考虑一个javax.swing.JPanel,下面是它的MouseListener

new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                var count = e.getClickCount();
                switch (count) {
                    case 1 -> Helper.sop("single count");
                    case 2 -> Helper.sop("double  count");
                    default -> Helper.sop("more than double count %d".formatted(count));
                }
            }
        }

双击后,我得到了以下令人费解的结果

single count
double  count

而不是预期的

double  count

显然,在双击过程中,在所述双击之前单击一次。为什么会这样?

rough.java


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

public class rough {


    public static void main(String[] args) throws Exception {


        //Helper.sop=System.out.println
        //Helper.launch=launch a JPanel in a JFrame (new,pack,EXIT_ON_CLOSE,<Screen_Size,UUIDTitle,SystemLAF,EDTThread)

        JPanel pn = new JPanel();
        pn.setPreferredSize(new Dimension(500, 500));

        ///////////////////THIS IS ALL THAT MATTERS HERE//////////////////////
        pn.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                var count = e.getClickCount();

                switch (count) {
                    case 1 -> Helper.sop("single count");
                    case 2 -> Helper.sop("double  count");
                    default -> Helper.sop("more than double count %d".formatted(count));
                }

            }
        });
        /////////////////////////////////////////////////////////////////////


        Helper.launch(pn);


    }


    private static class Helper {

        static public int frameNo = 0;

        public static void sop(Object o) {

            System.out.println(o);
        }

        public static void launch(JPanel pnMain, String frameTitle, String lafClassName) {

            try {
                UIManager.setLookAndFeel(lafClassName);
                f.sop("set laf to " + lafClassName);
            } catch (Exception e) {
                System.err.println("err: couldn't apply laf");
            }

            final var screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            final var pnSize = pnMain.getPreferredSize();


            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {

                    JFrame frame = new JFrame(frameTitle);

                    if (pnSize.width > screenSize.width || pnSize.getHeight() > screenSize.getHeight())
                        frame.setPreferredSize(new Dimension((int) (screenSize.width * 0.75), (int) (0.75 * screenSize.height)));


                    frame.setContentPane(pnMain);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setVisible(true);

                }
            });

        }

        public static void launch(JPanel pnMain, String frameTitle) {

            launch(pnMain, frameTitle, UIManager.getSystemLookAndFeelClassName());

        }


        public static void launch(JPanel pnMain) {

            String title = "Frame no: " + ++frameNo + "\t (" + UUID.randomUUID() + ")";
            launch(pnMain, title);

        }


    }

}

Env:
openjdk 15.0.2 2021-01-19
openjdk运行时环境(构建15.0.2 7-27)
openjdk 64位服务器虚拟机(构建15.0.2 7-27,混合模式,共享)
Windows 10

共有1个答案

尹俊雅
2023-03-14

显然,在双击过程中,在双击之前有一次单击

这是正常和预期的行为。

操作系统定义了“点击间隔”。如果在间隔内多次单击,则单击次数将增加。

如果你慢慢点击,你会得到多次点击。

如果你在“点击间隔”内快速点击,你会得到一次点击和一次双击。

如果你真的点击得很快,你可以得到一个由点击次数决定的单次、双次和三次点击。

通常您使用:

  1. 单击“选择”某物,然后

想象一下Windows资源管理器中的文件列表。单击一下将选择该项目。双击将对选定的项目执行某些操作。如果是文本文件,它将在默认编辑器中打开它。如果是. mp3文件,它将在默认音乐播放器中播放这首歌。

 类似资料:
  • 问题内容: 我必须在鼠标移动时画线,单击鼠标后,应该继续画线,直到双击为止。说点A,点B和点C。在点A上单击鼠标时,应开始画线。当在B点上单击鼠标时,除非双击,否则上一条线应该与新线一起从B点开始绘制。C点应相同,依此类推,直到双击鼠标为止。经过研究,我编写了下面的代码,它工作得很好,但是它可以用于拖动NOT MOUSE MOVE事件,我试图将代码转移到mouseMoved事件,但是上一行消失了。

  • 问题内容: 我试图用Javascript编写视频扑克游戏,以降低其基础知识,但是我遇到了一个问题,其中jQuery click事件处理程序多次触发。 它们被附加到用于下注的按钮上,并且对于在游戏过程中第一手下注(仅触发一次)非常有效。但是在秒针下注中,每次按下一个下注或下注按钮都会触发两次点击事件(因此,每次按下正确的赌注量是两次)。总体而言,在按一次下注按钮时,触发单击事件的次数遵循此模式序列的

  • 我找到了其他相关的问题,但没有一个答案实际上解决了我的问题。这个按钮在IE上很好用,但在Chrome上不行。我尝试移除span元素,将按钮放在任何其他标记之外,但仍然触发了两次。这个temple扩展了一个'base.html'文件,代码位于'main'元素中。 HTML: jQuery:

  • 我想在点击某个div(“.checker”)后触发点击输入事件。换句话说,点击'.checker'将模拟点击复选框上的点击事件,远程检查它。 我写的代码可以工作,但click只有在第二次单击后才触发,第一次单击失败时才触发。这种情况甚至不会发生在'.checker'上,也会发生在checkbox上。 下面的所有HTML都包装在jquery折叠菜单中。单击“H3”后,“.sub-tree-wrap”

  • 问题内容: 有人能想到一种忽略Java双击附带的单击的好方法吗? 我希望每种行为都有不同的行为,例如: 单击可在点击点上绘制十字准线 双击选择屏幕上的对象,但应该 不是 搽点击点十字线 …有人能想到一种方法吗?某种计时器设置可能是?一个想法赞赏:-) <免责声明> …而且是的,我知道我正在犯一个最令人发指的可用性/ UI伪装。 问题答案: 实际上,您需要在MouseAdapter的重写mouseC

  • 我有一个光标适配器显示的项目列表,当我使用时,我得到了正确的行并且能够做我需要的事情(我的目标是在单击时向该项目添加视图。现在我需要在单击单元格中的按钮时发生此操作。但是,按钮单击事件不会返回正确的单元格,而是随机返回列表中的其他单元格,这是我的代码中的一个示例: 在这个示例代码中,我想要单击单元格中的按钮,让我访问按钮真正所在的视图,但是我从随机列表单元格中获取视图,如何在我的单击侦听器中获取正