考虑一个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
显然,在双击过程中,在双击之前有一次单击
这是正常和预期的行为。
操作系统定义了“点击间隔”。如果在间隔内多次单击,则单击次数将增加。
如果你慢慢点击,你会得到多次点击。
如果你在“点击间隔”内快速点击,你会得到一次点击和一次双击。
如果你真的点击得很快,你可以得到一个由点击次数决定的单次、双次和三次点击。
通常您使用:
想象一下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
我有一个光标适配器显示的项目列表,当我使用时,我得到了正确的行并且能够做我需要的事情(我的目标是在单击时向该项目添加视图。现在我需要在单击单元格中的按钮时发生此操作。但是,按钮单击事件不会返回正确的单元格,而是随机返回列表中的其他单元格,这是我的代码中的一个示例: 在这个示例代码中,我想要单击单元格中的按钮,让我访问按钮真正所在的视图,但是我从随机列表单元格中获取视图,如何在我的单击侦听器中获取正