我正在实施扫雷,我在处理鼠标事件时遇到了一些问题。我希望在mouseRelease(而不是mousePressed)上进行操作,因此用户可以在按下鼠标按钮后改变主意。有三种可能的行动:
行动并不重要,我遇到的问题是如何触发它们。
在案例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
}
}
}
答案 0 :(得分:4)
明显的解决方案是跟踪鼠标按下。在这种情况下,我认为不需要玩超时。
因此按下两个按钮,然后释放一个按钮,将不算作单个按钮的释放。事实上,在你的情况下,它可能什么都不做。只有当其他鼠标按钮被释放时,才会计为释放两个按钮。
编辑:实际上,你甚至不需要跟踪鼠标按下,虽然你可能想要按下按钮的视觉指示,释放它会产生效果。但是当按钮被释放,并且你仍然按下时检测到其他按钮时,只需设置一个标志,即发出两个按钮释放的一半,然后单个释放一个按钮就可以完成它。如果单个按钮释放时未设置标志,则它不是两个按钮动作的一部分,而是执行单个按钮释放操作。