Обнаружение и действие на клавишах направления клавиатуры в Java - PullRequest
9 голосов
/ 21 февраля 2009

G'day all,

У меня есть консольный проект, в котором предполагается, что пользователь нажимает клавиши направления на клавиатуре (не цифровую клавиатуру) для перемещения аватара. Я испытываю затруднения с кодированием, чтобы проверить нажатие этих клавиш. В Паскале было достаточно легко использовать «readkey» и код, например, для # 80 для нажатия клавиши «вниз». Тем не менее, я поставлен в тупик, как реализовать те же функции в Java, хотя я думаю, что понимаю использование System.in и BufferedInputStream.

Может ли кто-нибудь помочь мне? Ваши мысли или советы очень ценятся.

Ответы [ 4 ]

6 голосов
/ 21 февраля 2009

Если java.io.console у вас не работает (я этого не пробовал), попробуйте JLine . Я использовал это, чтобы решить неопределенно похожую проблему .

5 голосов
/ 21 февраля 2009

К сожалению, это невозможно сделать переносным способом:

http://forums.sun.com/thread.jspa?threadID=5351637&messageID=10526512

В Windows чтение из System.in будет блокироваться до нажатия enter, даже если вы не используете BufferedReader. Стрелки будут циклически перемещаться по истории команд. Попробуйте сами:

import java.io.*;
public class KeyTest {
  public static void main(String[] argv) {
    try {
      InputStreamReader unbuffered = new InputStreamReader(System.in);
      for (int i = 0; i < 10; ++i) {
        int x = unbuffered.read();
        System.out.println(String.format("%08x", x));
      }
    } catch (Exception e) {
      System.err.println(e);
    }
  }
}

Та же проблема с использованием класса Console (ввод буферизован под Windows, клавиши со стрелками интерпретируются Windows):

import java.io.*;
public class KeyTest2 {
  public static void main(String[] argv) {
    try {
      Console cons = System.console();
      if (cons != null) {
        Reader unbuffered = cons.reader();
        for (int i = 0; i < 10; ++i ) {
          int x = unbuffered.read();
          System.out.println(String.format("%08x", x));
        }
      }
    } catch (Exception e) {
      System.err.println(e);
    }
  }
}
4 голосов
/ 21 февраля 2009

Проблема поддержки консоли в Java хорошо известна, я не уверен, что это выполнимо.

Это изначально было невозможно с System.in, так как он работал на основе строк.

В конце концов Sun добавила класс java.io.Console.

Вот его JavaDocs: http://java.sun.com/javase/6/docs/api/java/io/Console.html

Как только вы получите консоль (я думаю, из System.console), вы можете получить считыватель и, возможно, прочитать символы из него, но я не уверен, включает ли он ключи.

Как правило, вы должны использовать Swing или AWT, если вам нужен доступ к клавиатуре, что глупо.

Начиная с 2007 года, об этом был запрос функции: здесь

0 голосов
/ 24 июля 2018

Не со встроенным кодом Java. Проверьте библиотеки java curses или JLine, как указано выше, если хотите продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...