2013-03-09 43 views
3

我正在实施扫雷,我在处理鼠标事件时遇到了一些问题。我想要在mouseRelease(而不是mousePressed)上执行操作,因此用户可以在按下鼠标按钮后改变主意。有三种可能的动作:如何检测两个鼠标按钮是否被同时释放?

  1. LMB发布 - 显示当前场
  2. 人民币发布 - 把国旗在当前场
  3. 都LMB和人民币发布 - 亮点或透露相邻领域

行动并不重要,我遇到的问题是如何触发它们。

在案例1和2没有其他按钮下来 - 这是很容易检查。

的问题是,在释放方法mouseRelease两次调用两个按钮的结果。如果两个按钮释放之间的延迟太大,我宁愿不触发操作。换句话说,只有两个按钮在大约同一时间释放时才会触发。

我可以方便地查看例如当按钮1被释放时按钮3处于关闭状态,但它并不真正有帮助。

目前,我有那么没有别的想法存储时间第一按钮被释放时,然后比较对当另一个按钮被释放的时间 - 如果差值足够小,触发操作。

我真的不喜欢与System.currentTimeMillis的()或System.nanoTime(打一个想法),我不知道是否有这样做的更好的办法?

SOLUTION:

什么已极度简化的问题并没有允许用户鼠标指示器拖动到另一字段(并且因此改变了“选择”字段)。释放两个按钮之间的延迟并不重要。如果鼠标指针转到另一个字段,则所有内容都被清除。以下是代码片段:

private static final int B1DM = MouseEvent.BUTTON1_DOWN_MASK; 
private static final int B3DM = MouseEvent.BUTTON3_DOWN_MASK; 

private boolean bothWereDown = false; 

@Override 
public void mousePressed(MouseEvent e) { 

    // action if single button pressed 
    // in my case this is a sub-action of pressing both buttons 

    int both = B1DM | B3DM; 
    bothWereDown = (e.getModifiersEx() & both) == both; 

    if (bothWereDown) { 
     // action if both buttons pressed 
    } 
} 

@Override 
public void mouseDragged(MouseEvent e) { 

    // some other code 

    if (/* if pointer leaves field where mouse was pressed */) { 
     // some other code 
     bothWereDown = false; 
     // some other code 
    } 
} 

@Override 
public void mouseReleased(MouseEvent e) { 
    // some other code 

    if (e.getButton() == MouseEvent.BUTTON1) { 
     if (bothWereDown) { 
      if ((e.getModifiersEx() & B3DM) != B3DM) { 
       // action if both released 
      } 
     } else { 
      // action if left button released 
     } 
    } else if (e.getButton() == MouseEvent.BUTTON3) { 
     if (bothWereDown) { 
      if ((e.getModifiersEx() & B1DM) != B1DM) { 
       // action if both released 
      } 
     } else { 
      // action if right button released 
     } 
    } 

} 

回答

4

明显的解决方案是跟踪鼠标按键。我认为,在这种情况下,没有必要玩弄超时。

因此,按下两个按钮,然后释放一个按钮,将不会算作单个按钮的释放。事实上,就你而言,它可能什么都不会做。只有当其他鼠标按钮被释放时,才会被视为释放这两个按钮。

编辑:其实,你甚至不需要跟踪鼠标按键,尽管你可能想要给出按钮被按下的视觉指示,并且释放它会产生效果。但是,当按钮被释放,并且您检测到其他按钮仍然被按下时,只需设置一个标志,即释放了两个按钮的一半,然后单键释放一个按钮即可完成。如果在单个按钮释放时没有设置标志,那么它不是两个按钮动作的一部分,而是您执行单一按钮释放动作。

+0

这实际上可以忽略此超时是一个好主意。这种情况下的行为并没有很好的定义,甚至在系统扫雷中发生了一些奇怪的事情。我知道Swing没有提供任何处理它的东西? – 2013-03-09 14:53:52

+0

@JaroslawPawlak在Swing中,我不知道任何与此相关的具体内容。我认为Swing支持Doubleclick,但是同时按下多个按钮的“和弦”,您必须处理好自己。但既然你只在发布时触发动作,它确实会更容易,不需要模糊的超时时间调整等。 – hyde 2013-03-09 15:11:13

+0

谢谢。我编辑了我的问题并添加了解决方案。 – 2013-03-09 15:46:11

相关问题