Класс роботов — если кнопка нажата?

Я прочитал и понял, как работает класс Robot в java. Единственное, что я хотел бы спросить, это как нажать и отпустить кнопку мыши внутри оператора if. Например, я бы сделал щелчок, только если (и сразу после) кнопка пробела нажата/отпущена. Я бы использовал код:

try {
  Robot robot = new Robot();
  if (/*insert my statement here*/) {
    try {
      robot.mousePress(InputEvent.BUTTON1_MASK);
      robot.mouseRelease(InputEvent.BUTTON1_MASK);
    } catch (InterruptedException ex) {}
  }
} catch (AWTException e) {}

person Giannis Thanasiou    schedule 07.08.2013    source источник
comment
Вы пытаетесь реализовать комбинацию клавиш и мыши (удерживая ПРОБЕЛ -> нажмите ЩЕЛЧОК), или вы хотите иметь короткий промежуток времени (после того, как клавиша была нажата), чтобы щелкнуть кнопку мыши?   -  person GGrec    schedule 07.08.2013
comment
После нажатия пробела сделайте щелчок :)   -  person Giannis Thanasiou    schedule 07.08.2013


Ответы (2)


К сожалению, нет способа напрямую управлять оборудованием (ну, на самом деле есть, но вам придется использовать JNI/JNA), это означает, что вы не можете просто проверить, является ли ключ нажимается.

Вы можете использовать KeyBindings для привязки клавиши пробела к действию, когда пробел нажат, вы устанавливаете флаг на true, когда он отпущен, вы устанавливаете этот флаг на false. Чтобы использовать это решение, ваше приложение должно быть приложением с графическим интерфейсом, это не будет работать с консольными приложениями.

Action pressedAction = new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        spaceBarPressed = true;
    }
};

Action releasedAction = new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        spaceBarPressed = false;
    }
};

oneOfYourComponents.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressed");
oneOfYourComponents.getInputMap().put(KeyStroke.getKeyStroke("released SPACE"), "released");
oneOfYourComponents.getActionMap().put("pressed", pressedAction);
oneOfYourComponents.getActionMap().put("released", releasedAction);

Затем используйте

try {
    Robot robot = new Robot();
    if (spaceBarPressed) {
        try {
            robot.mousePress(InputEvent.BUTTON1_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_MASK);
        } catch (InterruptedException ex) {
            //handle the exception here
        }
    }
} catch (AWTException e) {
    //handle the exception here
}

Как писал GGrec, лучший способ сделать это — выполнить нажатие мыши непосредственно при запуске события клавиатуры:

Action pressedAction = new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        try {
            robot.mousePress(InputEvent.BUTTON1_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_MASK);
        } catch (InterruptedException ex) {
            //handle the exception here
        }
    }
};
person BackSlash    schedule 07.08.2013
comment
Спасибо за ваш подробный ответ! Дело в том, что я хочу это для своей видеоигры, поэтому она должна быть вне графического интерфейса :( - person Giannis Thanasiou; 07.08.2013

Мое предложение состоит в том, что вы прослушиваете событие клавиатуры, и когда вы его получаете, вы выполняете свой код без if statement. Добавьте слушателя на свой холст или что-то еще.

Будьте осторожны, чтобы не создавать заново класс Robot каждый раз.

new KeyAdapter() {

     @Override
     public void keyReleased(final KeyEvent e) {

           if (e.keyCode == KeyEvent.VK_SPACE)
                 try {
                     robot.mousePress(InputEvent.BUTTON1_MASK);
                     robot.mouseRelease(InputEvent.BUTTON1_MASK);
                 } catch (InterruptedException ex) {
                 }

     }

}
person GGrec    schedule 07.08.2013