Чтение с клавиатуры без нажатия «enter» с помощью JCurses - PullRequest
2 голосов
/ 05 декабря 2011

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

Я пытался использовать Toolkit.readCharacter() следующим образом:

InputChar c = Toolkit.readCharacter();
system.out.println(c.getCharacter());

Но проблема заключалась в том, что метод readCharacter() не заканчивает выполнение независимо от того, какмного символов, которые вы вводите.Даже если вы нажмете ввод, кажется, что он ждет ввода символа.

Я очень ценю любую помощь с использованием JCurses, или любой другой способ подойдет.

Ответы [ 2 ]

0 голосов
/ 10 июня 2017

Эта программа работала для меня.
Вам необходимо вызвать Toolkit.init () , чтобы перевести терминал в режим cbreak ().И не забудьте вызвать Toolkit.shutdown () перед выходом.

Пара недостатков.

  • jcurses автоматически переводит tty в режим cbreak, а jcurses не предоставляет метод для непосредственного управления библиотекой curses.
  • после перехода в jcurses вывод находится в режиме cbreakи прямые строки из Java имеют переводы строк, но не возвращают каретки.
  • разработчики jcurses реализовали только часть проклятий владения целым экраном.jcurses кажется излишним, если все, что вам нужно, это режим cbreak.

Программа.

import jcurses.system.CharColor;
import jcurses.system.InputChar;
import jcurses.system.Toolkit;

public class itest 
{

    public static void main(String[] args) 
    {
        int y = 0;
        CharColor color = new CharColor(CharColor.BLACK, CharColor.WHITE);
        Toolkit.init();
        while (true) {
            InputChar c = Toolkit.readCharacter();
            if ('q' == c.getCharacter())
                break;
            Toolkit.printString(String.format("c : %c", c.getCharacter()), 0, y++, color);
        }
        Toolkit.shutdown();
    }
}
0 голосов
/ 21 июня 2013

Java Curses имеет несколько специфических методов распознавания нажатий клавиш, но привязка себя к внешней библиотеке для одной функции может быть не лучшим решением.

То, чего вы хотите, может быть достигнуто путем создания терминала-стиль Swing и использование KeyListener для обнаружения событий нажатия клавиш.Однако в MadProgrammer отмечает, как заставить esc остановить метод , что такое решение может иметь "проблемы с фокусом".

Так что, если вы хотите отследить определенные нажатия клавиш или хотите повлиять на поведение программыосновываясь на различных пользовательских вводах, я бы рекомендовал использовать привязки клавиш , которые реализованы как часть Swing.

например,

component.getInputMap(WHEN_IN_FOCUSED_WINDOW).put
    (KeyStroke.getKeyStroke("F1"),"actionName");
component.getActionMap().put("actionName", yourAction);

Где компонент - любой объект JComponent(предположительно дисплей терминала), и yourAction - любое действие Swing.Использование параматеризованной формы getInputMap(), как показано здесь, предпочтительнее для «консольного» приложения, поскольку пользователь обязательно будет нажимать клавиши в окне верхнего уровня, и, следовательно, фокусировка компонента не имеет значения.

...