2012-08-30 16 views
6

Parte de la interfaz de línea de comando para un programa Estoy escribiendo llamadas para barras de progreso múltiples. Actualmente puedo actualizar una sola línea en la consola mediante el uso de la secuencia de escape \r con algo similar a esto:Interfaz de línea de comandos de Java: tener múltiples barras de progreso en diferentes líneas usando ' r'

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

Sin embargo, el retorno de carro solamente se remonta al comienzo de esa línea. Quiero una forma de retroceder dos líneas (o más generalmente, cualquier número de líneas) y tener ambas/todas las actualizaciones.

¿Hay alguna forma de hacerlo?

+1

No es fácil. Verifique estas preguntas http://stackoverflow.com/questions/1001335/java-gotoxyx-y-for-console-applications?lq=1 http://stackoverflow.com/questions/4906141/move-printing -position-of-command-line-interface-in-java-without-using-external? lq = 1 http://stackoverflow.com/questions/439799/whats-a-good-java-curses- como-biblioteca-para-terminal-aplicaciones – Flavio

Respuesta

2

Desafortunadamente no hay equivalente a \r que mueve el cursor hacia arriba. Sin embargo, esto se puede hacer con secuencias de escape ANSI, siempre que pueda suponer que está en un terminal compatible con ANSI.

para imprimir sus barras de progreso usando códigos ANSI, que podría hacer

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

El único problema con los códigos ANSI es que, mientras que casi todos los terminales utilizan códigos ANSI, the Win32 Terminal doesn't. No lo he probado, pero this library parece que sería bueno investigar si también necesitas soportar el terminal integrado de Windows. Incluye una biblioteca JNI que hará cosas equivalentes en el terminal de Windows y automáticamente decidirá si usará la biblioteca JNI o ​​los códigos ANSI. También tiene algunos métodos para hacer que los códigos ANSI sean un poco más fáciles de usar.

4

He escrito un pequeño proyecto para las barras de progreso de la línea de comandos que pueden hacer tanto líneas como un "maestro/detalle" - ver https://github.com/tomas-langer/cli/tree/master/cli-progress. Funciona también en Windows: utilizando secuencias de escape ANSI con implementación nativa para MS Windows (Chalk + Jansi)

Si desea hacer más, consulte la biblioteca de Chalk (https://github.com/tomas-langer/chalk) que a su vez usa Jansi (mencionado anteriormente en publicaciones anteriores)

El código de escape ansi para alineación y línea clara se encuentra en la biblioteca de Chalk. Para usarlos:

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 
Cuestiones relacionadas