有谁能想出一个好办法来忽略Java中双击所带来的单击?
我希望每一个都有不同的行为,这样:
- 单击在单击点上绘制十字光标
- 双击在屏幕上选择一个对象,但是不在点击点上画十字线
......有谁能想出一个办法来做到这一点吗?也许是某种计时器设置?一个想法赞赏:-)
......是的,我知道我犯了一个最令人发指的可用性/UI错误。
- 编辑#2:**
即使这样做的延迟,由于计时器是疯狂的-我放弃这个解决方案,并使用中键选择,而不是双击...
- 编辑:**
谢谢cgull-这是我能够想出给你的确认,有没有简单的方法来做到这一点(注意,如果我设置计时器〈200奇数赛车之间的点击和计时器,但只要我设置为一个值〉200的事情工作只是桃色):
public void mouseClicked(MouseEvent e) {
System.out.println( "Click at (" + e.getX() + ":" + e.getY() + ")" );
if (e.getClickCount() == 2) {
System.out.println( " and it's a double click!");
wasDoubleClick = true;
}else{
Integer timerinterval = (Integer)
Toolkit.getDefaultToolkit().getDesktopProperty(
"awt.multiClickInterval");
timer = new Timer(timerinterval.intValue(), new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (wasDoubleClick) {
wasDoubleClick = false; // reset flag
} else {
System.out.println( " and it's a simple click!");
}
}
});
timer.setRepeats(false);
timer.start();
}
}
6条答案
按热度按时间qgelzfjb1#
实际上,您需要在MouseAdapter的重写mouseClicked()方法中设置一个Timer来检测两次点击之间的时间间隔。默认间隔(ms)可以通过查询
Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval")
找到。如果在计时器到期之前检测到另一次鼠标点击,则您可以双击,否则一旦计时器到期,您可以处理单击。s8vozzvw2#
实际上,我认为有一个更简单的解决方案(使用InputEvent的getWhen()方法):
gv8xihay3#
您是否已经尝试过实现MouseListener接口?
我认为MouseEvent有一个点击计数方法(或属性)来知道这一点。
我打赌你已经经历过了,那么你面临的问题是什么?
也许你能做的就是用一个线程或其他东西来编码单击和双击之间的时间间隔。
因此,只有在300毫秒内没有发出另一次点击时,单击才有效。(可配置)
其理念是:
或者类似的东西。
xuo3flqw4#
替代解决方案:
在我找到这个问题的解决方案之前我就想通了。想法是一样的,使用计时器,虽然更复杂:)。
使用
SwingWorker
:在
mouseClicked()
方法中,您可以执行以下操作:我希望它能有用。
8cdiaqws5#
多亏了这个线程,我才做出了这个类似的解决方案,这是我想象的方式。它让一个
Timer
线程(其中的单击事件被安排为200毫秒的延迟)一直保持活动状态--这可能会让一些人感到不安,但毕竟启动一个线程是昂贵的,不是吗?最后一次
TimerTask
的跟踪被保留,如果双击到达,则调用它的cancel()
方法。如果双击在200 ms内到达,则取消它的单击,如果晚了,则没有效果。我使用JavaFX,但这应该不重要。核心的东西是X1 M3 N1 X和X1 M4 N1 X。
ulydmbyx6#
在查找这个问题的答案时,我正在考虑一个不同的解决方案,但没有找到,所以我分享了我的想法:
其他解决方案在单击处理中引入的延迟有点痛苦,因为您会得到这种延迟的响应。然而,这些解决方案是最容易实现的,并且不会打扰其余的代码。
另一种选择是:
单击可产生的所有事件都是可撤消的,并且在关联的双击事件到达时撤消。
实现撤销是一个有趣的主题,但为了简单起见,我将给予一个非常基本的例子:
注意,这里主要、次要和中间按钮事件是混合的,您应该跟踪每个按钮的
lastSingleClickTime
,或者将处理仅限于主要按钮,因为它通常是唯一使用双击的按钮。对于一个实现撤销的数据模型,我们会记住单击触发的
Action
(假设它是一个类,具有run()
和undo()
方法,执行相反的操作),并在双击事件到达时在Action
示例上调用.undo()
。