簡體   English   中英

雙擊也觸發 java.awt.event.MouseAdapter 中的單擊

[英]Double click also triggering single click in java.awt.event.MouseAdapter

考慮一個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));
                }
            }
        }

雙擊后,我得到以下令人費解的 output

single count
double  count

而不是預期的

double  count

顯然,在雙擊期間,單擊在所述雙擊之前。 為什么會這樣


粗略.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-Bit Server VM(build 15.0.2+7-27,混合模式,共享)
Windows 10

顯然,在雙擊期間,單擊先於所述雙擊

這是正常和預期的行為。

操作系統定義了“點擊間隔”。 如果您在間隔內單擊多次,則單擊次數將增加。

如果您緩慢單擊,您將獲得多次單擊。

如果您快速單擊,則在“單擊間隔”內,您將獲得單擊和雙擊。

如果您真的快速點擊,您可以獲得由點擊次數決定的單次、雙擊和三次點擊。

通常,您使用:

  1. 單擊以“選擇”某些內容並
  2. 雙擊“處理”某些東西。

想想 Windows 資源管理器中的文件列表。 單擊一下將 select 項目。 雙擊將對所選項目執行某些操作。 如果是文本文件,它將在默認編輯器中打開。 如果是 .mp3 文件,它將在默認音樂播放器中播放歌曲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM