【发布时间】:2011-05-02 09:17:49
【问题描述】:
我想知道当鼠标在组件中双击时我们如何执行操作。
【问题讨论】:
标签: java swing mouseevent double-click
我想知道当鼠标在组件中双击时我们如何执行操作。
【问题讨论】:
标签: java swing mouseevent double-click
public void mouseClicked(MouseEvent event)
{
if (event.getClickCount() == 2 && event.getButton() == MouseEvent.BUTTON1) {
System.out.println("double clicked");
}
}
【讨论】:
event.getButton() == MouseEvent.BUTTON1,只计算鼠标左键的双击次数。
SwingUtilities.isLeftMouseButton(event)
我的问题是,如果用户单击,我必须以一种方式响应,如果他们单击多次,则必须以另一种方式响应(当我多次单击时,我的 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);
}
}
});
【讨论】:
如果您想让您的用户在短时间内执行多次双击,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 和资源并不友好。
Timer 对象。我会将这个计时器作为对象的一个字段移动,以允许从其他位置(例如右键单击或其他位置)对其进行管理。 2/ 这些计时器每 500 毫秒将取消标记您的双击,然后如果您必须双击两次,则最后一次可能无法按预期工作。
假设你的意思是在 Swing 中,为你的组件分配一个 MouseListener:
addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){
// your code here
}
}
});
参考:
【讨论】: