# [SWT] - ProgressBar, Prozentzahlen live anzeigen geht nicht



## pocketom (20. Jun 2007)

Hi,

ich möchte den Fortschritt in meinem Progressbar auch in Prozent anzeigen lassen, also quasi über den PBar drübergelegt so dass es so aussieht als ob die Prozente eingebettet währen. Geht das? kennt irgendwer eine agewandelte Klasse von ProgressBar die das bietet? ich selbst krieg es nicht hin, mein Label mit dem ich die Prozentzahlen live hochzählen will zeigt erst ganz zum Schluss etwas an (100%), die Schritte dazwischen ignoriert es, während der Ladebalken selbst gut funktioniert???


----------



## babuschka (20. Jun 2007)

Kommt das nicht auf den Layoutmanager an?


----------



## pocketom (20. Jun 2007)

Gute Frage  :bahnhof:

Im Moment krieg ich es nichtmal hin neben meinem Progressbar ein label anzeigen zu lassen das die Prozent parallel zum Fortschrittsbalken hochzählt.


Hier meine Progressbarklasse


```
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;


public class GUI_ProgressBar {

	private static Composite 		pbarholder;
	private static ProgressBar 		pbar;
	private static Label			description;
	private static Label			percent;
	
	
	GUI_ProgressBar(Composite parent)
	{
		// composite holding the prograssbar and its labels...
		pbarholder = new Composite(parent, SWT.RIGHT);				
		
		GridLayout pbarlayout = new GridLayout();
		pbarlayout.numColumns = 3;
		pbarholder.setLayout(pbarlayout);
		
		GridData pbargriddata = new GridData(GridData.FILL_HORIZONTAL);
		pbargriddata.horizontalAlignment = SWT.RIGHT;
		pbarholder.setLayoutData(pbargriddata);		
		
		description = new Label(pbarholder, SWT.NULL);
		description.setText("Progress: ");
				
		pbar = new ProgressBar(pbarholder,SWT.HORIZONTAL);
		pbar.setMinimum(0);
		pbar.setMaximum(100);
		
		percent = new Label(pbarholder, SWT.NULL);
		percent.setText("");
	}
	
	// actualize progressbar (0-100%)
	public static void setPercent(int p)
	{
		pbar.setSelection(p);		
		percent.setText(String.valueOf(p)+" %");
	}
	// set description text;
	public static void setDescription(String text)
	{		
		description.setText(text);
		System.out.println("TEXT");
	}
	// return pbars display
	public Display getDisplay()
	{
		return pbar.getDisplay();
	}
}
```



Ansprechen lässt es sich nun ganz einfach:


```
GUI_Progressbar pbar = new GUI_ProgressBar(parent);

pbar.getDisplay().syncExec(new Runnable() {
	public void run() {
		pbar.setPercent(value);  // 0 - 100							
	}
});
```


Dummerweise aktualisiert sich die Prozentanzeige (das Label "percent") aber nicht laufend, während der Progressbar einwandfrei live aktualisiert. Nachdem der Vorgan beendet ist und der Progressbar 100% erreicht hat, steht dann auch plötzlich 100% dahinter...  Sowohl der Progressbar als auch das Prozentlabel werden in ein und der selben Funktion akualisiert (void setPercent(int p)).Das ist doch vollkommen unlogisch oder ???:L


----------



## pocketom (20. Jun 2007)

Weiss wirklich niemand was ich falschmache? Ich hänge seit Stunden nur an diesem Sch**ssproblem und dreh gleich durch. Ich check einfach nicht wieso der ProgressBar sich aktualisiert und das Label 0,0. Bin ich zu dämlich?


----------



## Guest (21. Jun 2007)

Sorry, ist natürlich Schmarrn, was ich da erzähle. Ich meinte nicht den Layout-Manager, sondern das LookAndFeel. 
Ich weis nicht, gibt doch bestimmt welche, die die Prozentzahl direkt in der Bar anzeigen, oder irgendeine Methode um das zu setzen. Oder muss das im Label geschehen?

Was bei deinem Prg allerdings falsch läuft kann ich dir auch nicht sagen. ???:L 
Scheint was mit den Threads zutun zu haben. Da bin ich aber der absolut falsche Mann!


----------



## babuschka (21. Jun 2007)

Hoppla, war nicht eingeloggt :shock: !
Das ^ kam natürlich von mir.


----------



## pocketom (21. Jun 2007)

Also so wie ich es haben wollte ist es halt als Notlösung gedacht gewesen indem ich halt die Prozentanzeige selbst daneben stricken wollte. Sehr unlogisch halt das der ProgressBar sich in Echtzeit parallel aktualisiert, mein Label jedoch erst am Schluss seinen Endwert anzeigt. Nehme auch mal schwer an das es was mit Threads zu tun hat, ich komm aber einfach ned drauf... :?


----------



## Guest (22. Jun 2007)

Woher bekommt value denn seinen Wertß
Läuft die Progressbar denn wirklich richtig?
Hast dus schon mit Swing probiert (weis gar nicht, ob man dass LookAndFeel bei SWT ändern kann :? )?

Ich glaube, man braucht hier einfach mehr Infos.
Aber mit den Threads, keine Ahnung.
Wie und wo wird der denn gestartet?


----------



## babuschka (22. Jun 2007)

^^^^Mal wieder nicht eingeloggt   ^^^^


----------



## Karpe (22. Jun 2007)

Benutze: 

progressBar.setStringPainted(true);

damit wird die Prozentzahl auotmatisch angezeigt.


----------



## Guest (22. Jun 2007)

Hallo again, 

in deinem Fall trage bitte direkt hinter:

pbar.setMaximum(100); 

*pbar.setStringPainted(true);*

ein.

Gruß, Karpe


----------



## pocketom (24. Jun 2007)

Hey danke, klasse Tip! Auf jeden Fall steig ich in der nächsten Version auf Swing um, auch wenn das leider ne Menge Arbeit wird, denn die GUI ist schon nicht mehr so ganz klein. Länger möcht ich mir das SWT aber echt nimmer antun.


----------



## pocketom (25. Jun 2007)

hi,

grade versucht es zu implementieren, vermute mal dein Tip bezieht sich auf Swing oder? Der Progressbar von SWT hat nämlich keine Methode namens setStringPainted()....  SWT k*tzt mich mal echt langsam voll an....  :x


----------



## Karpe (26. Jun 2007)

Hallo,

ja richtig. Es handelt sich um Swing.

Gruß, Karpe


----------

