# Fortschrittsbalken



## SnopyJav (16. Sep 2013)

Hallo Community,

ich bin ein Java-Anfänger und versuche einen Fortschrittsbalken in meine Programm zu integrieren. Mein Programm läuft eine bestimmte Zeit, weshalb der Fortschrittsbalken einen Zeitbezug haben soll - ggf. Prozentuale Angabe. Muss ich dafür im dem ProgressBar die Differenz vom Startzeitpunkt und dem aktuellen Zeitpunkt ausgeben? 


```
long before = System.currentTimeMillis();      // Startzeitpunkt Methode
long current = System.currentTimeMillis();     // aktueller Zeitpunkt

int max = maxDuration // in Minuten

final JProgressBar bar = new JProgressBar( 0, max );
frame.getContentPane().add( bar );

bar.setValue( current - before  );
bar.setStringPainted(true);
```

Vielen Dank für eure Hilfe


----------



## Fab1 (16. Sep 2013)

Habe ehrlich gesagt noch nie eine ProgresBar verwendet. Aber ich finde die Oracle Tutorials immer sehr hilfreich. Wenn diese auf den ersten Blick auf unübersichtlich aussehen. Versuchs einfach mal. How to Use Progress Bars (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Viel Erfolg!


----------



## Sehales (16. Sep 2013)

Rein rechnerisch macht das schonmal recht wenig Sinn. Du wirst so ja immer nur einen immer größer werdenden Wert setzen. Nicht aber die Zeit genau berechnen, bzw. anzeigen, die dein Programm noch braucht.
Wenn du weißt wielange das Programm braucht, dann kannst du einfach die Zeitspanne, die bereits vergangen ist, in Prozent umrechnen und der ProgressBar setzen.
Falls du die Zeit nicht kennst und zum Beispiel die Verarbeitungszeit von Dateien anzeigen möchtest, kannst du das zum Beispiel entweder per Anzahl der Dateien, die es gibt und die schon bearbeitet wurden, lösen oder du setzt die ProgressBar auf "indeterminate", bis du ein Ergebnis hast oder um dem User einfach anzuzeigen, dass da etwas passiert und das Programm nicht stehen geblieben ist.

Wenn du aber keinerlei feste, und vorallem bekannte, Werte hast, dann ist es schwer anzuzeigen wieviel bereits fertig ist.


----------



## javaDev2011 (16. Sep 2013)

Hi,

also du kennst ja die verstrichene Zeit bzw. kannst sie messen.
Wenn bei 20% z.B. 8 sec. verstrichen sind, wird der Rest schätzungsweise 8/0.2*0.8, also 32 sec. dauern. Das kannst du dem User anzeigen.

Was du natürlich brachst ist ein messbarer "Fortschritt" (nicht nur bei Zeitanzeige, sondern bei jeder JProgressBar), also z.B. heruntergeladene KB, bearbeitete Pixel oder gelöschte Dateien.


```
import java.awt.Dimension;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JProgressBar;

public class TimeEstimatingProgressBar extends JProgressBar {

    private static final DateFormat df = new SimpleDateFormat("mm:ss");
    private long startTime;
    private int t;

    public TimeEstimatingProgressBar(int max) {
        super(0, max);
        startTime = System.currentTimeMillis();
        setStringPainted(true);
    }

    @Override
    public void setValue(int value) {
        super.setValue(value);
        t = (int) (((System.currentTimeMillis() - startTime) / 1000 / (float) value) * (getMaximum() - value));
    }

    @Override
    public String getString() {
        return super.getString() + (super.getString().equals("0%") ? "" : "  (" + df.format(new Date(t * 1000)) + " remaining)");
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        return new Dimension(d.width + getGraphics().getFontMetrics().stringWidth(getString()), d.height);
    }
}
```

Du musst dem Konstruktor lediglich den Maximalwert übergeben (also 20, wenn insgesamt z.B. 20 Dateien gelöscht werden sollen).
Nach jedem Schritt - der natürlich in einem anderen Thread durchgeführt werden muss, damit die GUI weiterhin funktioniert - musst du die TimeEstimatingProgressBar dann per setValue updaten.

Hoffe das hilft,
javaDev2011


----------

