如何检测是否同时释放了两个鼠标按钮?

时间:2013-03-09 14:38:25

标签: java swing mouseevent

我正在实施扫雷,我在处理鼠标事件时遇到了一些问题。我希望在mouseRelease(而不是mousePressed)上进行操作,因此用户可以在按下鼠标按钮后改变主意。有三种可能的行动:

  1. LMB发布 - 揭示当前字段
  2. 人民币释放 - 在当前领域放置一面旗帜
  3. LMB和RMB均已发布 - 突出显示或显示相邻字段
  4. 行动并不重要,我遇到的问题是如何触发它们。

    在案例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
            }
        }
    
    }
    

1 个答案:

答案 0 :(得分:4)

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

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

编辑:实际上,你甚至不需要跟踪鼠标按下,虽然你可能想要按下按钮的视觉指示,释放它会产生效果。但是当按钮被释放,并且你仍然按下时检测到其他按钮时,只需设置一个标志,即发出两个按钮释放的一半,然后单个释放一个按钮就可以完成它。如果单个按钮释放时未设置标志,则它不是两个按钮动作的一部分,而是执行单个按钮释放操作。