Java:Thread.sleep鼠标按下延迟

Java:Thread.sleep鼠标按下延迟,java,Java,我一直在尝试使用jnativehook在java中创建一个自动clicker。 它工作正常,甚至可以编译和运行。我的问题是使用Thread.sleep尝试在单击之间添加延迟: bot.mousePress(InputEvent.BUTTON1_MASK); Thread.sleep(50); bot.mouseRelease(InputEvent.BUTTON1_MASK); 如果我输入0的延迟,它将正常工作。但是,如果没有延迟,它将点击得太快。 当我添加一个延迟时,它会单击fine,但当我释

我一直在尝试使用jnativehook在java中创建一个自动clicker。 它工作正常,甚至可以编译和运行。我的问题是使用
Thread.sleep
尝试在单击之间添加延迟:

bot.mousePress(InputEvent.BUTTON1_MASK);
Thread.sleep(50);
bot.mouseRelease(InputEvent.BUTTON1_MASK);
如果我输入0的延迟,它将正常工作。但是,如果没有延迟,它将点击得太快。 当我添加一个延迟时,它会单击fine,但当我释放触发键时,它会在给定的时间内持续单击几秒钟。但是,0的延迟将不会执行此操作

完整代码:

public class App implements NativeKeyListener{

private JPanel panel1;
private JTabbedPane tabbedPane1;
private JButton spoilerButton;
private JSlider slider1;
private JSlider slider2;

//Removed irrelevant code...

static Robot bot;

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

static boolean pressed;

public void click() throws InterruptedException {

    try {

        bot.mousePress(InputEvent.BUTTON1_MASK);
            Thread.sleep(50);
        bot.mouseRelease(InputEvent.BUTTON1_MASK);

    } catch (Exception e) {
        e.printStackTrace();
    }}

@Override
public void nativeKeyPressed(NativeKeyEvent e) {
    if (NativeKeyEvent.getKeyText(e.getKeyCode()) == "Delete") {
        pressed = true;
        while (pressed){
            try {
                click();
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }


    }}

@Override
public void nativeKeyReleased(NativeKeyEvent e) {
    if (NativeKeyEvent.getKeyText(e.getKeyCode())=="Delete"){
        pressed=false;
    }}

@Override
public void nativeKeyTyped(NativeKeyEvent e) {

}

public static void main(String[] args) {

    JFrame frame = new JFrame("Autoclicker");
    frame.setContentPane(new App().panel1);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setSize(400,148);
    frame.setResizable(false);

    try{GlobalScreen.registerNativeHook();
    } catch (Exception e){
                System.exit(1);}
    GlobalScreen.addNativeKeyListener(new App());

}
} 

当您继续按触发器键时,似乎会连续调用nativeKeyPressed()方法。这会导致对click()方法的多次调用(假设它是多线程的),并且由于鼠标按下和释放之间的sleep()(鼠标单击在释放时完成),这可能会发生

因此,您可以根据根本原因尝试两种选择:
1.释放鼠标后移动sleep()调用。如果同时调用nativeKeyPressed,这将不起作用。

2.按下触发器时,请使用其他线程执行click()方法。在这种情况下,您可能需要在每次使用“按下”复选框并在其中单击()调用时向线程提交一个可运行对象。这将确保它不会在按下变为false后运行。

看起来,当您继续按下触发器键时,会连续调用nativeKeyPressed()方法。这会导致对click()方法的多次调用(假设它是多线程的),并且由于鼠标按下和释放之间的sleep()(鼠标单击在释放时完成),这可能会发生

因此,您可以根据根本原因尝试两种选择:
1.释放鼠标后移动sleep()调用。如果同时调用nativeKeyPressed,这将不起作用。

2.按下触发器时,请使用其他线程执行click()方法。在这种情况下,您可能需要在每次使用“按下”复选框并在其中单击()调用时向线程提交一个可运行对象。这将确保它不会在按下变为false后运行。

我怀疑这与多线程相关,因此支持Rajeev。不过,我不确定他的建议是否有效。但是,我也不确定我是否理解,你在这里想做什么。我的理解(请确认/更正):按键->鼠标点击(按下和释放)将重复模拟。按键释放:点击将停止。这将是正确的。然后我会推荐一个线程的组合,并将在各自的事件上设置。也就是说:您将创建一个线程,其中有一个无限循环执行click-sim。但是:它会阻止等待条件-我们称之为“已激活”。所以,你不会有无限的旋转等待。然后检查原子布尔值是否为真。如果是执行click sim,如果不是再次等待条件。按下键将设置AtomicBoolean并通知条件,释放键将只重置AtomicBoolean。我怀疑这与多线程相关,因此支持Rajeev。不过,我不确定他的建议是否有效。但是,我也不确定我是否理解,你在这里想做什么。我的理解(请确认/更正):按键->鼠标点击(按下和释放)将重复模拟。按键释放:点击将停止。这将是正确的。然后我会推荐一个线程的组合,并将在各自的事件上设置。也就是说:您将创建一个线程,其中有一个无限循环执行click-sim。但是:它会阻止等待条件-我们称之为“已激活”。所以,你不会有无限的旋转等待。然后检查原子布尔值是否为真。如果是执行click sim,如果不是再次等待条件,则按下keyPressed将设置AtomicBoolean并通知条件,keyReleased将只重置AtomicBoolean。