Как написать эквивалент 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>