10

G'day all、

ユーザーがキーボードの方向キー(数字以外のキーパッド)を押してアバターを移動することを目的としたコンソールプロジェクトがあります。これらのキーが押されているかどうかを確認するためのコーディングに問題があります。Pascalでは、「readkey」とコードを使用するのは簡単でした。たとえば、下キーを押すための#80の場合です。ただし、System.inとBufferedInputStreamの使用法は理解していると思いますが、Javaで同じ機能を実装する方法に困惑しています。

誰か助けてもらえますか?あなたの考えやヒントは大歓迎です。

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

enterWindowsでは、を使用しない場合でも、System.inからの読み取りはが押されるまでブロックされます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 に答える