10

万事如意,

我有一个控制台项目,旨在让用户按下键盘方向键(非数字键盘)来移动头像。我很难编码来检查这些键的按下情况。在 Pascal 中,使用“readkey”和代码很容易,例如,#80 用于向下按键。但是,我很难理解如何在 Java 中实现相同的功能,尽管我认为我了解 System.in 和 BufferedInputStream 的使用。

谁能帮帮我?非常感谢您的想法或提示。

4

4 回答 4

6

如果 java.io.console 对您不起作用(我没有尝试过),请尝试JLine。我用它来解决一个类似的问题

于 2009-02-21T18:38:22.683 回答
5

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 年,有一个关于它的功能请求:这里

于 2009-02-21T02:50:22.463 回答
5

不幸的是,这是不可能的便携方式:

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);
    }
  }
}
于 2009-02-21T02:57:39.590 回答
0

不使用内置 Java 代码。如果您想继续,请查看上面提到的 java curses 库或 JLine。

于 2018-07-24T01:53:53.037 回答