# Fortschrittsbalken für die TextKonsole



## DerKleineVomSee (19. Januar 2006)

Hi,
ich habe schon einige Zeit gegoogelt, aber leider nichts gefunden was mir helfen könnte. 
Ich versende Daten (Server/Client) und möchte hierzu den aktuellen Übertragungs stand wissen ->Fortschrittsbalken.
Wenn ich eine GUI hätte, könnte ich ja die JProcessBar nehmen, aber ich habe ein reines Konsolen Programm.
Hat einer von euch eine Idee wie man soetwas realisieren kann?
Danke schonmal.


----------



## Snape (19. Januar 2006)

Moin,
gib doch für alle 5% Fortschritt ein '*' oder ähnliches zusätzlich aus mit System.out.print(), oder geht das nicht oder erfüllt nicht den Zweck?


----------



## javaprogger1987 (19. Januar 2006)

Was recht praktisch ist, das hab ich getestet mit der Dos-Konsole ist folgendes:

Machste z.B. nen Prozentbalken so:


```
[#####-----------------------]
```
 und aktualisierst das dann immer.
Wenn du ein

```
System.out.print( "\r" );
```
 machst, springt der wieder an den Anfang der Zeile und du kannst das alte überschreiben.


----------



## DerKleineVomSee (19. Januar 2006)

Das mit dem \r wusste ich nicht. Dann ist es klar wie es gehen muss.

Dazu kommt nur noch das ich die Prozentzahl berechnen muss. Leider habe ich da noch ein kleines Problem.

z.B. aktueller Wert von help: 2852864
bei fileInput.available() kommt 3349481 raus.
Wie kann es dann sein das prozent einen Wert von 574.0 hat
Mathematisch ist die Formel korrekt.


```
int prozent = Math.round((100*help)/fileInput.available());
```

Habt ihr ne Ahnung wo der Fehler liegt?


----------



## flashray (19. Januar 2006)

int prozent = Math.round((help/fileInput.available())*100);


----------



## DerKleineVomSee (19. Januar 2006)

Folgende Zeile war schon richtig.


```
int prozent = Math.round((100*help)/fileInput.available());
```

Aus wirgendwelchen Gründen hat das fileInput.available() nicht die korrekte file größe ausgegeben. Wenn ich die Dateigröße aber einfach in einer Variablen angebe, dann passt es alles.



```
int fileSize = fileInput.available();
int prozent = Math.round((100*help)/fileSize);
```

Ich danke für die schnelle hilfe.


----------



## DerKleineVomSee (19. Januar 2006)

Jetzt funktioniert das alles, nur eine Sache nervt noch etwas.
Uns zwar springt der Cursor in der Konsole immer hin und her. Kann ich den irgendwie ausstellen?


----------



## javaprogger1987 (19. Januar 2006)

Wo hast du denn in der Konsole nen Cursor?
  So sieht das bei einem von mir aus, vllt. machst du auch mal nen Bild von dem was du meinst...

Der Cursor ist doch weg wenn das Java-Programm läuft oder? Bei mir ist das so...


----------



## DerKleineVomSee (19. Januar 2006)

Habe mal ein Bild gemacht. Der Cursor der jetzt am Anfang der Zeile steht, wandert immer  bei der aktualisierung des Fortschrittsbalken durch. Dadurch das er nach jedem Packet was geschickt wurde,  aktualisiert wird, läuft der Cursor durch und nervt halt ziemlich. Ich hoffe ihr versteht jetzt was ich meine.


----------



## javaprogger1987 (19. Januar 2006)

Hmm.. Kenn mich mit der Linux-Shell nich so sehr aus, würd aber sagen, das das nen Anzeigeproblem der Shell ist.. Kannste den Cursor unter Ansicht vllt ausstellen?


----------



## DerKleineVomSee (19. Januar 2006)

Ausstellen kann ich ihn leider nicht. Ich denke auch, dass das nicht der richtige Weg sein kann. Kann man nicht irgendwie die Cursor Position festlegen?


----------



## Thomas Darimont (19. Januar 2006)

Hallo!

   Ich würde das so machen:

```
package de.tutorials;
   
   /**
    * @author Tom
    * 
    */
   public class ConsoleProgressIndicator {
   
   	int minValue;
   
   	int currentValue;
   
   	int maxValue;
   
   	int maxChars;
   
   	char progressChar = '#';
   
   	int charsPrintedCount;
   
   	public ConsoleProgressIndicator(int maxChars, char progressChar) {
   		this.maxChars = maxChars;
   		this.progressChar = progressChar;
   	}
   
   	/**
   	 * @param args
   	 */
   	public static void main(String[] args) throws Exception {
   		new ConsoleProgressIndicator(40, '#')
 			 .execute(new IRunnableWithConsoleProgressIndicatorSupport() {
   				    public void run(
 						 ConsoleProgressIndicator consoleProgressIndicator) {
 					 int minValue = 0;
 					 int maxValue = 200; // 100, 1000, 50, 20
 					 consoleProgressIndicator.setup(minValue, maxValue);
 					 for (int i = minValue; i < maxValue; i++) {
 						 consoleProgressIndicator.updateProgress(i);
 						 try {
 							 Thread.sleep(10L);
 						 } catch (InterruptedException e) {
 							 e.printStackTrace();
 						 }
   					    }
   					}
   				});
   
   	}
   
   	protected void setup(int minValue, int maxValue) {
   		this.minValue = minValue;
   		this.maxValue = maxValue;
   	}
   
   	private void execute(
 		 IRunnableWithConsoleProgressIndicatorSupport runnableWithConsoleProgressIndicatorSupport) {
   		System.out.print("[");
   		runnableWithConsoleProgressIndicatorSupport.run(this);
   		System.out.println("]");
   	}
   
   	static interface IRunnableWithConsoleProgressIndicatorSupport {
   		void run(ConsoleProgressIndicator consoleProgressIndicator);
   	}
   
	public void updateProgress(int value) {
   		double actualProgressPercentage = (double) value / maxValue;
   
   		int charsToPrint = (int) (actualProgressPercentage * maxChars)
   				- charsPrintedCount;
   
   		if (charsToPrint > 0) {
   			for (int i = 0; i < charsToPrint; i++) {
 				System.out.print(progressChar);
   			}
   			this.charsPrintedCount += charsToPrint;
   		}
   		
   		this.currentValue = value;
   	}
   }
```
 
 Um die Prozentuale Anzeige an einer fixen Stelle innerhalb der Konsole anzuzeigen musst du entweder ein wenig magie mit den verschiedenen Escape Sequenzen betreiben \r ...etc. Oder du verwendest JCurses:
http://www.tutorials.de/tutorials177095.html&highlight=jcurses

   Btw. der Fortschritt einer langlaufenden Aktion liese sich sicherlich auch sehr schön als Aspekt modellieren (Monitoring) ;-)

   Gruß Tom


----------



## javaprogger1987 (20. Januar 2006)

Da hat sich Tom aber richtig ins Zeug gelegt 
Mir ist noch was eingefallen, warum der Cursor mitwandert..
Ich würd mal versuchen die Zeichen nicht einzeln nacheinander auszugeben:

```
for (int i = 0; i < 10; i++)
{
.
.
  System.out.print("#");
.
.
}
```

sondern erst die ganze Zeile zu einem String zusammen zu basteln und die komplett auszugeben..


----------



## DerKleineVomSee (22. Januar 2006)

Die Idee hatte ich auch schon, aber leider hilft das nicht wirklich.


----------

