Hallo!
Ich möchte bei dem folgenden Code eine ProgressBar einbauen, die den Status der zu lesenden Datei repräsentiert. In der while-Schleife befindet sich eine Zeile, wo ein counter hochgezählt wird. Der wird nur leider 1 mal hochgezählt und so kann ich schlecht einen Status zurückgeben. Wo und wie mache ich das in diesem Beispiel ohne dabei den BufferedInputStream wegzunehmen?
Code:
BufferedInputStream in = null;
ByteArrayOutputStream out = null;
File f = new File(this.datalocation);
byte buffer[] = new byte[(int)f.length()];
try {
in = new BufferedInputStream(new FileInputStream(f));
out = new ByteArrayOutputStream((int)f.length());
buffer = new byte[(int)f.length()];
int bytesRead;
int counter=0;
while((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
counter++;
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (in != null) try { in.close(); } catch (Exception e) { e.printStackTrace(); }
}
Ja, ich habe deinen Artikel als Vorlage genommen, aber du hast ja manuell über JProgressBar.setValue() in der eigendlichen Methode die ProgessBar gesetzt, oder?
Das geht ja hier nicht, weil die Schleife nicht durchläuft.
Die Schleife in der FAQ läuft auch nie durch. Der Witz an der Sache ist nur, dass die Schleife in einem separaten Thread läuft, und deshalb der veränderte Wert der ProgressBar angezeigt wird.
Ohne dass du deinen Algo in einen Thread auslagerst, wird das nicht funktionieren.
Achso, es scheint als müsste ich mir deine Vorlage noch mal genauer anschauen.
VIelen Dank bis dahin. Ich melde mich nochmal, wenn es ein Problem gibt.
Das ist die Stelle, die ich in Algorithmus.java nicht ganz verstehe:
Code:
while( current <= end && !isInterrupted() ){
try {
Thread.sleep( 100 ); // Kurz warten
} catch (InterruptedException e) {}
setValue( current++ ); // Hey! Es ist was passiert!
}
Über setValue wird doch die bar aktualisiert, oder? Und zwar immer, wenn diese Zeit von 100 Millisek. vorbei ist. Aber ich habe ja bei meinem Problem nicht die Chance dazu, weil ich es nicht wie hier in eine while-schleife packen kann.
Hm, bin jetzt nicht ganz sicher ob ich dich richtig verstehe, aber solange du irgendwo ein Zähler hast (und eine Schätzung, was das Maximum ist), kannst du auch immer den Wert der Progressbar ändern (halt an den Stellen, an der dein Zähler inkrementiert wird).
Das ist ja leider das Problem. Durch den BufferedInputStream wird das, wie ich denke, mit einem mal in das array geladen. Somit kann ich nicht die stelle des gerade gelesenen bits lesen und das Value dieses Progessbars berechnen.
Du kannst den Counter doch um "bytesRead" erhöhen.
Du würdest sowieso nix sehen, wenn du jedes Bit einzeln darstellst :wink: (bzw. das Progi wird extrem langsam).