![](/img/trans.png)
[英]java.lang.NoClassDefFoundError for java.awt.event.MouseAdapter in Applet
[英]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
显然,在双击期间,单击先于所述双击
这是正常和预期的行为。
操作系统定义了“点击间隔”。 如果您在间隔内单击多次,则单击次数将增加。
如果您缓慢单击,您将获得多次单击。
如果您快速单击,则在“单击间隔”内,您将获得单击和双击。
如果您真的快速点击,您可以获得由点击次数决定的单次、双击和三次点击。
通常,您使用:
想想 Windows 资源管理器中的文件列表。 单击一下将 select 项目。 双击将对所选项目执行某些操作。 如果是文本文件,它将在默认编辑器中打开。 如果是 .mp3 文件,它将在默认音乐播放器中播放歌曲。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.