编辑 - Java while 循环意味着不调用事件

EDIT - Java while loop means events aren't called

所以我在 Cruncher 的帮助下更新了我的代码,现在答题器似乎工作得更好了。然而,虽然 while(pressed) 循环是 运行,但没有其他事件被调用,所以它保持 运行.

public class 函数实现 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 循环会阻止事件被调用吗?我需要使用多线程还是一些爵士乐?

谢谢。

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

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 将在开始时为 false(大概),它只会退出而不是 运行 在以后的点击中。

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

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);
    }
}