我正在实施扫雷,我在处理鼠标事件时遇到了一些问题。我想要在mouseRelease(而不是mousePressed)上执行操作,因此用户可以在按下鼠标按钮后改变主意。有三种可能的动作:如何检测两个鼠标按钮是否被同时释放?
- LMB发布 - 显示当前场
- 人民币发布 - 把国旗在当前场
- 都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
}
}
}
这实际上可以忽略此超时是一个好主意。这种情况下的行为并没有很好的定义,甚至在系统扫雷中发生了一些奇怪的事情。我知道Swing没有提供任何处理它的东西? – 2013-03-09 14:53:52
@JaroslawPawlak在Swing中,我不知道任何与此相关的具体内容。我认为Swing支持Doubleclick,但是同时按下多个按钮的“和弦”,您必须处理好自己。但既然你只在发布时触发动作,它确实会更容易,不需要模糊的超时时间调整等。 – hyde 2013-03-09 15:11:13
谢谢。我编辑了我的问题并添加了解决方案。 – 2013-03-09 15:46:11