Как написать эквивалент KeyListener с JLine?

Я работаю над консольным приложением, написанным на Java. Что мне нужно сделать, это обрабатывать ввод с клавиатуры пользователя. Когда длительный процесс запускается с нашей программой в терминале, пользователь должен иметь возможность нажать 'q' в любое время остановить процесс (который выполняется в отдельном потоке).

Я пробовал несколько вещей:

  • Запуск в другом потоке чего-то, что читает пользовательский ввод и выдает InterruptedException в поток процесса
  • Использование JLine и его ConsoleReader
  • Используя JLine и добавьте TriggeredAction связан с клавишей клавиатуры

Но каждый раз сталкиваюсь с одной и той же проблемой: пользователь должен нажать ENTER ключ, и я не хочу этого.

Спасибо за помощь, если у вас есть идеи или реальное решение моей проблемы.

PS: Пожалуйста, если вы думаете, что это невозможно, не отвечайте. Я знаю, что это возможно.

1 ответ

Возможно, вы могли бы использовать одну из этих библиотек,

http://sourceforge.net/projects/jxgrabkey/ для Linux

https://code.google.com/p/jintellitype/ для Windows

Менее связана с вашим вопросом, но я думаю, что может помочь вам,

http://sourceforge.net/projects/javacurses/

Проблема всего этого в том, что вы потеряете независимость от платформы.

Чтобы избежать нажатия пользователем клавиши ввода и иметь возможность напрямую реагировать на нажатие клавиши, мы можем использовать jline3 следующим образом, при этом сначала мы переводим терминал в режим raw, чтобы напрямую реагировать на клавиши, а затем ждем следующего ввода характер.

var terminal = TerminalBuilder.terminal()
terminal.enterRawMode()
var reader = terminal.reader()

var c = reader.read()
<dependency>
    <groupId>org.jline</groupId>
    <artifactId>jline</artifactId>
    <version>3.12.3</version>
</dependency>
Другие вопросы по тегам