2012-08-30 14 views
6

プログラム用のコマンドラインインターフェイスの一部複数のプログレスバーの呼び出しを記述しています。私は現在、これに似た何かを\rエスケープシーケンスを使用して、コンソール内の1行を更新することができます。Javaコマンドラインインターフェイス: ' r'を使用して異なる行に複数のプログレスバーを表示

System.out.printf("\rProcess is %d%% complete", percentageComplete); 

キャリッジリターンのみ、その行の先頭に戻りますが。私は2つの行(またはより一般的には、任意の行数)に戻って両方の/すべてを更新する方法が欲しい。

これを実行する方法はありますか?

+1

これは簡単ではありません。これらの質問を確認してください。 http://stackoverflow.com/questions/1001335/java-gotoxyx-y-for-console-applications?lq=1 http://stackoverflow.com/questions/4906141/move-printing Javaを使用しないJavaのコマンドラインインタフェースの位置づけlq = 1 http://stackoverflow.com/questions/439799/whats-a-good-java-curses-ターミナルアプリケーションのようなライブラリー – Flavio

答えて

2

残念ながら、カーソルを上に移動する\rに相当するものはありません。しかし、これは、ANSI準拠の端末を使用していると仮定できる限り、ANSIエスケープシーケンスで行うことができます。

は、ANSIコードの唯一の問題はあなたが

System.out.printf(((char) 0x1b) + "[1A\r" + "Item 1: %d ", progress1); 
System.out.printf(((char) 0x1b) + "[1B\r" + "Item 2: %d ", progress2); 

行うことができ、ANSIコードを使用して、プログレスバーを印刷するには、そのほぼすべての端末は、ANSIコードを使用しながら、the Win32 Terminal doesn't。私はそれをテストしていませんが、this libraryは、あなたが組み込みのWindows端末をサポートする必要があるかどうか調べることは良いことになるように見えます。これには、Windows端末上で同等の処理を行うJNIライブラリが含まれており、JNIライブラリを使用するかANSIコードを使用するかが自動的に決定されます。また、ANSIコードを少し使いやすくするためのいくつかのメソッドもあります。

4

私は、1つのライナーまたは "マスター/ディテール"を実行できるコマンドラインプログレスバー用の小さなプロジェクトを作成しました。https://github.com/tomas-langer/cli/tree/master/cli-progressを参照してください。また、Windows上でも動作します - MS Windows(Chalk + Jansi)のネイティブ実装でANSIエスケープシーケンスを使用します。

さらに処理したい場合は、Chalkライブラリ(https://github.com/tomas-langer/chalk) )。

ラインアップとクリアラインのansiエスケープコードは、チョークライブラリにあります。 使用するには:

import com.github.tomaslanger.chalk.Ansi; 
... 
System.out.print(Ansi.cursorUp(2)); //move cursor up two lines 
System.out.print(Ansi.eraseLine()); //erase current line 
関連する問題