识别java中的双击
Posted
技术标签:
【中文标题】识别java中的双击【英文标题】:identifying double click in java 【发布时间】:2011-05-02 09:17:49 【问题描述】:我想知道当鼠标在组件中双击时我们如何执行操作。
【问题讨论】:
【参考方案1】:public void mouseClicked(MouseEvent event)
if (event.getClickCount() == 2 && event.getButton() == MouseEvent.BUTTON1)
System.out.println("double clicked");
【讨论】:
您可能还想检查event.getButton() == MouseEvent.BUTTON1
,只计算鼠标左键的双击次数。
@SeanVanGorder 或SwingUtilities.isLeftMouseButton(event)
【参考方案2】:
我的问题是,如果用户单击,我必须以一种方式响应,如果他们单击多次,则必须以另一种方式响应(当我多次单击时,我的 Swing VM 似乎最多可以计数四次单击)。当我运行上面的示例时,它似乎将三次单击计为一次单击。所以,这是我的重写。基本上,我只有一个计划任务,等待灰尘清除,然后检查注册的点击次数。 400 毫秒的等待似乎对我来说效果最好。
JButton jButton = new JButton("Click Me!");
jButton.addMouseListener(new MouseAdapter()
private int eventCnt = 0;
java.util.Timer timer = new java.util.Timer("doubleClickTimer", false);
@Override
public void mouseClicked(final MouseEvent e)
eventCnt = e.getClickCount();
if ( e.getClickCount() == 1 )
timer.schedule(new TimerTask()
@Override
public void run()
if ( eventCnt == 1 )
System.err.println( "You did a single click.");
else if ( eventCnt > 1 )
System.err.println("you clicked " + eventCnt + " times.");
eventCnt = 0;
, 400);
);
【讨论】:
【参考方案3】:如果您想让您的用户在短时间内执行多次双击,e.getClickCount()==2
是不够的。
您受到桌面配置的限制。
你可以通过查看Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
的结果得到它
绕过该问题的一个好方法是不使用getClickCount()
检查,而是使用Timer
,您可以在其中选择点击之间的最大间隔并自行处理计数(非常简单)。
相关代码:
boolean isAlreadyOneClick;
@Override
public void mouseClicked(MouseEvent mouseEvent)
if (isAlreadyOneClick)
System.out.println("double click");
isAlreadyOneClick = false;
else
isAlreadyOneClick = true;
Timer t = new Timer("doubleclickTimer", false);
t.schedule(new TimerTask()
@Override
public void run()
isAlreadyOneClick = false;
, 500);
用 Win Xp 操作系统测试,完美。
【讨论】:
智能使用Timer
取消设置标志,比两个瞬间之间的比较更复杂,但更易于使用。我看到的缺点是:在哪里存储 isAlreadyOneClick
?似乎在解决彼此的同时也带来了问题。如果(让我们想象一下)点击完成得非常快,这个解决方案的行为也会有“漏洞”:每次Timer
将重置标志,只有在这个时候,才会处理真正的双击。另外,我认为这种方法对 GC 和资源并不友好。
您好 Benj 我无法理解垃圾收集器和标志之间的关系。您认为继续进行的方式会破坏某些东西吗?请问,您能否进一步说明您的示例及其后果?抱歉,我没看到你想显示的内容。
我看到了两件事: 1/ 只是每次遇到“else”部分时,都会创建一个新的Timer
对象。我会将这个计时器作为对象的一个字段移动,以允许从其他位置(例如右键单击或其他位置)对其进行管理。 2/ 这些计时器每 500 毫秒将取消标记您的双击,然后如果您必须双击两次,则最后一次可能无法按预期工作。
不是很清楚,请原谅 :) 但是如果用户不是偷偷摸摸的,你的代码是正确的;)
你相信这个......这么低质量的问题......而且比我的任何人都支持更多。 hrmpf.【参考方案4】:
假设你的意思是在 Swing 中,为你的组件分配一个 MouseListener:
addMouseListener(new MouseAdapter()
@Override
public void mouseClicked(MouseEvent e)
if(e.getClickCount()==2)
// your code here
);
参考:
Java 教程:How to write a Mouse Listener【讨论】:
以上是关于识别java中的双击的主要内容,如果未能解决你的问题,请参考以下文章