2012-08-30 11 views
6

Parte dell'interfaccia della riga di comando per un programma Sto scrivendo chiamate per più barre di avanzamento. Posso attualmente aggiornare una sola riga nella console utilizzando la sequenza \r di fuga con qualcosa di simile a questo:Interfaccia della riga di comando Java: con più barre di avanzamento su linee diverse utilizzando ' r'

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

Tuttavia il ritorno a capo risale solo al punto di partenza di quella linea. Voglio un modo per tornare indietro di due righe (o più in generale, un numero qualsiasi di righe) e averle entrambe/tutti gli aggiornamenti.

C'è un modo per farlo?

+1

Non è facile. Controlla queste domande. 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-senza-using-external? lq = 1 http://stackoverflow.com/questions/439799/whats-a-good-java-curses- like-library-per-terminali-applicazioni – Flavio

risposta

2

Sfortunatamente non esiste un valore equivalente a \r che sposta il cursore verso l'alto. Tuttavia, questo può essere fatto con sequenze di escape ANSI, a patto che si possa presumere di essere su un terminale conforme ANSI.

Per stampare le barre di avanzamento utilizzando i codici ANSI, si potrebbe fare

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

L'unico problema con i codici ANSI è che, mentre quasi tutti i terminali utilizzano codici ANSI, the Win32 Terminal doesn't. Non l'ho provato, ma this library sembra che sarebbe una buona cosa da esaminare se è necessario supportare anche il terminale integrato di Windows. Include una libreria JNI che farà cose equivalenti sul terminale di Windows e deciderà automa- ticamente se usare la libreria JNI oi codici ANSI. Ha anche alcuni metodi per rendere i codici ANSI leggermente più facili da usare.

4

Ho scritto un piccolo progetto per le barre di avanzamento della riga di comando che possono eseguire un solo liner o un "master/dettaglio" - vedere https://github.com/tomas-langer/cli/tree/master/cli-progress. Funziona anche su Windows - usando sequenze di escape ANSI con implementazione nativa per MS Windows (Chalk + Jansi)

Se vuoi fare di più, controlla la libreria Chalk (https://github.com/tomas-langer/chalk) che a sua volta usa Jansi (menzionato già nei post precedenti).

Il codice di escape ansi per line up e clear line si trova nella libreria Chalk. Per utilizzarli:

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 
Problemi correlati