【问题标题】:EDIT - Java while loop means events aren't called编辑 - Java while 循环意味着不调用事件
【发布时间】:2017-01-20 14:30:11
【问题描述】:

所以我在 Cruncher 的帮助下更新了我的代码,现在点击器似乎工作得更好了。然而,当 while(pressed) 循环正在运行时,没有调用其他事件,因此它一直在运行。

公共类函数实现 NativeMouseListener {

private Robot robot;

private boolean pressed = false;

private boolean skip = false;

public Function()
{
    try {
        robot = new Robot();
    } catch (AWTException e) {
        e.printStackTrace();
    }
}

private void repeatMouse()
{
    skip = true;
    robot.mouseRelease(InputEvent.BUTTON1_MASK);
    while (pressed)
    {
        System.out.println("pressed while loop " + pressed);
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@Override
public void nativeMouseClicked(NativeMouseEvent nativeMouseEvent) {

}

@Override
public void nativeMousePressed(NativeMouseEvent nativeMouseEvent) {
    System.out.println("GG");
    if (!(nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)) {
        System.out.println("Returned.");
        return;
    }
    if (!Native.get().getData().getEnabled())
    {
        System.out.println("Isn't enabled.");
        return;
    }

    pressed = true;
    repeatMouse();
}

@Override
public void nativeMouseReleased(NativeMouseEvent nativeMouseEvent) {
    System.out.println("released");
    if (!(nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)) {
        System.out.println("Returned 2");
        return;
    }
    if (!skip)
    {
        System.out.println("pressed " + pressed);
        pressed = false;
        System.out.println("pressed " + pressed);
    } else {
        skip = false;
    }

}

}

知道为什么 while 循环会阻止事件被调用吗?我需要使用多线程还是一些爵士乐?

谢谢。

【问题讨论】:

  • 只是一个猜测,但您可能需要在开始时发送一个鼠标向上事件,然后是一堆鼠标点击事件,并监听真正的鼠标向上事件停止。
  • @Cruncher “真实”事件?我正在使用按下和释放并设置一个布尔值。这是错的吗?
  • 你能告诉我答案中提供的代码是否对你有帮助吗?
  • 非常有帮助,非常感谢您的宝贵时间!

标签: java click mouse


【解决方案1】:

一方面,您的主要方法未包含在您的代码中,但我假设它包含以下行(或类似行):

new Project()

try {
    bot = new Robot();
} catch (AWTException e) {
    e.printStackTrace();
}

while (pressed) {
    bot.mousePress(InputEvent.BUTTON1_MASK);
    //bot.mouseRelease(InputEvent.BUTTON1_MASK);
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

现在让我们看看这段代码。当它运行时,pressed 将在开始时为假(大概),它只会退出并且不会在以后的点击中运行。

您想要做的是在您注册点击时开始循环。让我们把它移到另一个方法中

private void repeatMouse() {
    bot.mouseRelease(InputEvent.BUTTON1_MASK);
    while (pressed) {
        bot.mousePress(InputEvent.BUTTON1_MASK);
        bot.mouseRelease(InputEvent.BUTTON1_MASK);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

现在让我们在鼠标按下原生挂钩中调用它

@Override
public void nativeMousePressed(NativeMouseEvent nativeMouseEvent) {
    if (nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)
    {
        pressed = true;
        System.out.println(pressed);
        repeatMouse();
    }
}

编辑:
看来您的另一个问题是,在第一次 mouseRelease 之后,处理程序将从本机库中调用。我对此有一个潜在的解决方案。

首先在定义pressed 变量的位置旁边,定义一个新的skipRelease

boolean skipRelease = false;

然后在每次调用 mouseRelease 之前,首先将 skipRelease 设置为 true。然后将您的 mouseRelease 处理程序更改为以下

@Override
public void nativeMouseReleased(NativeMouseEvent nativeMouseEvent) {
    if (nativeMouseEvent.getButton() == NativeMouseEvent.BUTTON1)
    {
        if(skipRelease) {
            skipRelease = false;
            return;
        }
        pressed = false;
        System.out.println(pressed);
    }
}

【讨论】:

  • 非常感谢@Cruncher
  • 但是,如何使值变为 false?因为如果您使用机器人来mousse release,那么mouseRelease 事件将被调用,因此pressed 将等于false。对吗?
  • @Archie 我的印象是本机调用不会从机器人注册。但是,如果他们这样做,您需要更聪明一点。我将编辑我的答案以寻找潜在的解决方案
  • 你很聪明。非常感谢。
  • @Archie 再想一想,如果您长时间点击,这可能会导致加速效果。因为每次点击都会产生另一个循环来点击更多。您需要对 mousePressed 使用相同的 skipRelease 方法。不过,我相信您能够从我的示例中弄清楚 :)
猜你喜欢
  • 2017-12-20
  • 2021-09-05
  • 2020-08-27
  • 1970-01-01
  • 2022-12-17
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多