使用布尔值检测鼠标单击?

时间:2015-10-17 15:18:29

标签: java

所以我有以下每20毫秒调用一次的方法:

public void update(Point mousePosition, boolean mouseDown) {
    //Creating an if statement that sees if the mouse is above the button   
    if(mousePosition.x > 50 && mousePosition.y > 50 && mousePosition.x < 125 && mousePosition.y < 100) {

    }
}

它将在指针所在的坐标中传递,并且我创建了一个if语句来检测指针何时位于按钮上方。现在使用布尔值mouseDown,我需要弄清楚如何检测点击和双击。

单击一下我需要检测mouseDown何时为真,然后为假(我不知道该怎么做),双击,我想我会用System.currentTimeMillis();来查看如果发生两次。

除了使用mouseDown之外,请不要推荐别的东西我必须在其他代码之上构建它,我需要坚持使用这种方法。

2 个答案:

答案 0 :(得分:0)

因此,当在同一位置生成mousePressed和mouseReleased事件时,会生成鼠标单击。

因此,在您的方法的上下文中,您需要在同一位置获取mouseDown == true和mouseDown == false。

双击取决于同一位置的2个mouseDown == false事件之间的时间。

因此,您需要确定上述两个事件之间的时间间隔,以确定何时发生双击。

执行此操作的一种方法是在收到第一个mouseDown == false时启动Timer。如果定时器触发,则表示您没有收到任何其他事件,因此您只需单击鼠标即可。

但是,在计时器触发之前接收到第二个mouseDown == false,然后在时间范围内生成两个事件,这意味着您有双击事件。

以下是演示该概念的示例代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class ClickListener extends MouseAdapter implements ActionListener
{
    private final static int clickInterval = (Integer)Toolkit.getDefaultToolkit().
        getDesktopProperty("awt.multiClickInterval");

    MouseEvent lastEvent;
    Timer timer;

    public ClickListener()
    {
        this(clickInterval);
    }

    public ClickListener(int delay)
    {
        timer = new Timer( delay, this);
    }

    public void mouseClicked (MouseEvent e)
    {
        if (e.getClickCount() > 2) return;

        lastEvent = e;

        if (timer.isRunning())
        {
            timer.stop();
            doubleClick( lastEvent );
        }
        else
        {
            timer.restart();
        }
    }

    public void actionPerformed(ActionEvent e)
    {
        timer.stop();
        singleClick( lastEvent );
    }

    public void singleClick(MouseEvent e) {}
    public void doubleClick(MouseEvent e) {}

    public static void main(String[] args)
    {
        JFrame frame = new JFrame( "Double Click Test" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.addMouseListener( new ClickListener()
        {
            public void singleClick(MouseEvent e)
            {
                System.out.println("single");
            }

            public void doubleClick(MouseEvent e)
            {
                System.out.println("double");
            }
        });
        frame.setSize(200, 200);
        frame.setVisible(true);
     }
}

此代码的要点是在生成双击事件时不生成第一个单击事件。

在您的情况下,如果事件在时间段内,您可能希望生成单击,然后双击。显然代码需要改变。我只想演示使用Timer来确定双击时间框架内是否发生了两次点击的概念。

因此,在您的情况下,代码会更简单一些。您可以将代码添加到update(...)方法中。每次收到mouseDown == false时,都会检查Timer。

如果定时器正在运行,则双击(并停止定时器)

如果Timer没有运行,只需单击一下(然后重新启动Timer)。

如果Timer触发事件,则停止Timer。

答案 1 :(得分:0)

声明两个if语句并让其中一个在鼠标为true时设置一个等于true的全局变量,然后设置另一个if语句来检测该全局变量是否为true以及鼠标是否未关闭。

这是sudo代码:

if(mouse is down)
{
   click=true;
}
if(click == true && mouse is not down)
{
   we have a click!
}