Обнаружение и действие с клавишами направления клавиатуры в Java

StackOverflow https://stackoverflow.com/questions/572001

  •  05-09-2019
  •  | 
  •  

Вопрос

Добрый день всем,

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

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

Это было полезно?

Решение

Проблема поддержки консоли в 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 год, был запрос функции по этому поводу: здесь

Другие советы

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

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

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);
    }
  }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top