2

ユーザーがEnterキーを押すのを待たずに、コンソールからキーを読み取る必要があるアプリケーションを作成しています。JCurses ライブラリが役立つことを読みました。

私はToolkit.readCharacter()このように使用してみました:

InputChar c = Toolkit.readCharacter();
system.out.println(c.getCharacter());

しかし問題は、readCharacter()何文字入力してもメソッドの実行が終了しないことでした。エンターを押しても文字入力待ちのようです。

JCurses を使用したり、その他の方法で何か助けていただければ幸いです。

4

2 に答える 2

0

Java Curses には特定のキーストローク認識方法がいくつかありますが、単一の機能のために外部ライブラリに縛られるのは最善の解決策ではないかもしれません。

KeyListener端末スタイルの Swing アプリケーションを作成し、 を使用してキーストローク イベントを検出することで、目的を達成できます。ただし、MadProgrammer は、「esc をメソッドで停止させる方法」で、そのようなソリューションには「フォーカスの問題」がある可能性があると述べています。

したがって、特定のキーストロークをトレースしたい場合、またはさまざまなユーザー入力に基づいてプログラムの動作に影響を与えたい場合は、Swing の一部として実装されているキー バインドを使用することをお勧めします。

例えば

component.getInputMap(WHEN_IN_FOCUSED_WINDOW).put
    (KeyStroke.getKeyStroke("F1"),"actionName");
component.getActionMap().put("actionName", yourAction);

component は任意のJComponentオブジェクト (おそらく端末ディスプレイ) であり、yourAction任意の Swing アクションです。getInputMap()「コンソール」アプリケーションでは、ここに示されているようにパラメーター化された形式を使用することをお勧めします。これは、ユーザーが必ずトップ レベル ウィンドウ内でキーストロークを行うため、コンポーネント フォーカスが無関係であるためです。

于 2013-06-21T05:31:42.607 に答える
0

このプログラムは私のために働きました。Toolkit.init()を呼び出して端末を cbreak() モードに
する必要があります。また、終了する前にToolkit.shutdown()を呼び出すことを忘れないでください。

いくつかの欠点。

  • jcurses は自動的に tty を cbreak モードにします。jcurses は curses ライブラリを直接操作する方法を提供しません。
  • jcurses に入ると、出力は cbreak モードになり、Java からの直接文字列には改行が含まれますが、キャリッジ リターンはありません。
  • jcurses の開発者は、画面全体を所有する curses 部分のみを実装しました。cbreak モードだけが必要な場合、jcurses は過剰に思えます。

プログラム。

import jcurses.system.CharColor;
import jcurses.system.InputChar;
import jcurses.system.Toolkit;

public class itest 
{

    public static void main(String[] args) 
    {
        int y = 0;
        CharColor color = new CharColor(CharColor.BLACK, CharColor.WHITE);
        Toolkit.init();
        while (true) {
            InputChar c = Toolkit.readCharacter();
            if ('q' == c.getCharacter())
                break;
            Toolkit.printString(String.format("c : %c", c.getCharacter()), 0, y++, color);
        }
        Toolkit.shutdown();
    }
}
于 2017-06-10T15:07:13.907 に答える