【问题标题】:Double click also triggering single click in java.awt.event.MouseAdapter双击也会触发 java.awt.event.MouseAdapter 中的单击
【发布时间】:2021-04-03 20:54:30
【问题描述】:

考虑一个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);

        }


    }

}

环境:
openjdk 15.0.2 2021-01-19
OpenJDK 运行时环境(内部版本 15.0.2+7-27)
OpenJDK 64 位服务器 VM(内部版本 15.0.2+7-27,混合模式,共享)
视窗 10

【问题讨论】:

  • 如果您想同时处理单击和双击,您可以依赖 单击间隔(请参阅here)。
  • @gthanop 我很惊讶古老的点击计数检查实际上也会触发一次点击!这与一个人的速度无关......我知道使用超时......认为这会很好
  • 使用点击直到获得所需的计数:e.consume();
  • 显然,在双击期间,单击先于所述双击 - 这是正常的预期行为。通常,您使用单击“选择”某些内容,然后双击“处理”某些内容。例如,当您编辑问题时。如果您单击插入符号移动。如果您双击插入符号移动并选择该单词。这是因为第一次单击移动插入符号,而双击选择了单词。正常问题是单击两次而不是单击一次和两次,因为单击速度不够快或鼠标移动。
  • @camickr 所以,也许这不是 Java 特定的,API 为 n-click 生成的事件在发生时是 n 次单击(更新点击次数),而不是点击次数达到 n 后的单次点击……这是正确的吗?

标签: java swing event-handling


【解决方案1】:

显然,在双击期间,单击先于所述双击

这是正常的预期行为。

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

如果您点击缓慢,您将获得多次单击。

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

如果您真的快速点击,您可以获得单次、双击和三次点击,具体取决于点击次数。

通常你使用:

  1. 单击以“选择”某些内容并
  2. 双击“处理”某些东西。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 2011-03-07
    • 2011-10-30
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多