В Java, как лучше всего захватить нажатие клавиши ‹tab›?

У меня возникли проблемы с захватом нажатия клавиши ‹tab› в моем приложении командной строки Java. Используя System.in.read(), я ничего не получаю при нажатии клавиши табуляции. Как лучше всего подойти к этому?

Чтобы дать некоторый контекст, я пытаюсь разрешить пользователю нажимать клавишу табуляции в середине команды, чтобы он автоматически завершал команду (так же, как вы могли бы сделать в оболочке bash). Я открыт для предложений, если есть лучшие подходы к достижению этой цели (возможно, использование System.in.read() не лучший способ приблизиться к этому?).


person Wilco    schedule 05.01.2011    source источник
comment
См. stackoverflow.com/questions/1066318 для обсуждения чтения одного символа в "необработанном режиме". Как указали Пол и Майкл, для этого потребуется решение, зависящее от платформы.   -  person robert_x44    schedule 06.01.2011


Ответы (3)


Взгляните на JLine. Я не использовал его сам. Он использует Windows DLL (с ​​использованием JNI) и имеет поддержку Linux для переключения консоли в символьный/необработанный режим вместо режима буферизации. Я никогда не использовал это раньше, так что используйте на свой страх и риск. Я также не уверен на 100%, решит ли это вашу проблему, но это того стоит :)

EDIT: я могу подтвердить, что это работает

ConsoleReader cr = new ConsoleReader();
while (cr.readVirtualKey() != 0x09){
  //loop till Tab is pressed
}

РЕДАКТИРОВАТЬ СНОВА: библиотека содержит автозаполнение (по нажатию табуляции) для командной строки... Наслаждайтесь :)

person Paul    schedule 05.01.2011

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

person Konstantin Komissarchik    schedule 05.01.2011

Данные из InputStream становятся доступными только тогда, когда пользователь нажал клавишу ввода. Я думаю, вы обнаружите, что если вы нажмете ввод после вкладки, вкладка появится.

В приложениях c есть что-то похожее: оболочка устанавливает режим ввода на raw вместо приготовленного, так как ему нужны необработанные нажатия клавиш. Readline — обычная библиотека, используемая для этого в Linux. Я не уверен, что общего в Windows. Насколько я могу думать, что-то, использующее JNI, здесь единственный вариант.

person Michael Lowman    schedule 05.01.2011