-3

私はTimerTaskを使用して、スレッドで実行されるプログラムの一部をシミュレートし、予測できない時間に出力を生成しています。

package consoletest;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;

public class ConsoleTest {
    public static void main(String[] args) {


        TimerTask tt = new TimerTask(){
            public void run() {
                System.out.print("\n***");
            }
        };

        new Timer(true).schedule(tt, 2000);

        Scanner scanner = new Scanner(System.in);
        System.out.print("enter a command: ");
        String line = scanner.nextLine();
    }
}

私の問題は、出力が発生したときにアクティブに入力している場合、出力は現在のカーソル位置に挿入され、カーソルが出力文字列の最後に配置されることです。

たとえば、12345678とゆっくり入力している私のスクリーンショットを次に示します。入力の途中で出力が挿入されていることがわかります。

問題のコマンドラインデモ

この非同期出力が現在の入力カーソルをそれほどひどく乱したくない。カーソルの位置を変更せずに、カーソルの位置の後に出力を印刷できれば、それで問題ありません。または、現在のプロンプトの前に出力を完全に印刷する(プロンプトを下に移動する)こともできますが、おそらく何らかの方法でプロンプトを終了し、出力を印刷してから、進行中の入力をコピーして新しいプロンプトを作成する必要があると思います。

4

1 に答える 1

0

次のようなものを使用する必要があります。

public static void main(String[] args) {

        String input = "";
        char c = (char) System.in.read();
        while(c!=-1){
              c = System.in.read();
              input += c;
              System.out.print("\r"+input+"***"); // \r returns the cursor to the line-beginning
        }

        //extra stuff
}

これはおそらくあなたが望むものです。Javaコードが間違っている可能性があり申し訳ありませんが、これは私の心から書いています...

于 2012-07-09T17:53:06.990 に答える