Обнаружение и действие с клавишами направления клавиатуры в Java
Вопрос
Добрый день всем,
У меня есть консольный проект, в котором предполагается, что пользователь нажимает клавиши направления клавиатуры (нецифровая клавиатура) для перемещения аватара.У меня возникли трудности с кодированием для проверки нажатия этих клавиш.В 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, как упоминалось выше, если вы хотите продолжить.