SWT Progressbar mit Textoverlay?

Bernd Hohmann

Top Contributor
Ich hab mir jetzt einen Wolf gesucht und nichts brauchbares gefunden: Ist es möglich, in SWT einen Progressbar mit einem Textoverlay zu versehen?

Hab mich mal mit einem NullLayout versucht und beide Komponenten übereinander geklatscht. Alle SWT.TRANSPARENT flags nützen nix, entweder nur der Progressbar oder nur das Label.

Bernd
Java:
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;

public class SWTApplication {

	protected Shell shell;
	protected ProgressBar pb;
	protected Label lbl;

	public static void main(String[] args) {
		try {
			SWTApplication window = new SWTApplication();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void open() {
		Display display = Display.getDefault();
		createContents();
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	protected void createContents() {
		shell = new Shell();
		shell.setSize(415, 294);
		shell.setLayout(null);
		// ###
		pb = new ProgressBar(shell, SWT.NONE);
		pb.setBounds(10, 10, 387, 20);
		// ###
		lbl = new Label(shell, SWT.TRANSPARENT);
		lbl.setBounds(10, 10, 387, 20);
		lbl.setText("Test");

		//
		pb.setVisible(true);
		pb.setMinimum(0);
		pb.setMaximum(100);
		pb.setSelection(75);
	}
}
 
Eine kurze Suche ergab folgenden Treffer:

Count Numbers : ProgressBarSWT JFace EclipseJava

Zusammengefaßt wird, der Progressbar mit addPaintListener ein PaintListener übergeben.

Der Paintlistener hat nur eine Methode und bekommt den PaintEvent, mit dem wiederum über den Graphics Context ein String über die Progressbar gezeichnet werden kann.

In verlinktem Beispiel wird die Prozentzahl ausgegeben. Das Codesnippet sollte ausreichende Dokumentation bieten.

Ich muß allerdings gestehen, daß ich das momentan nicht ausprobiert habe.
Ein Feedbeck ob es funktioniert, wäre sehr nett.
 
Ich habs mal für mich umgebaut. Ursprünglich war "MessageWidget" nur eine Statuszeile, dann kam rechts ein Progressbar dazu. Weil das Ganze zu viel Platz verschwendet (insbesondere wenn der Progressbar nicht gebraucht wurde) bin ich auf die Idee mit dem Textoverlay gekommen.

Die Klasse sollte mit jedem GUI Designer klarkommen.

Java:
package de.zwanzigeins.tagtaggo.widgets;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

/**
 * Messagearea with Progressbar and Text as overlay.
 * 
 * 28.11.2012 ho: message over progressbar
 * 05.09.2012 ho: creation (hohmann@harddiskcafe.de)
 */

public class MessageWidget extends Composite {

	private ProgressBar pbMsg = null;
	private String strMessage = null;
	private Display display = null;
	private int intOldLwb = -1;
	private int intOldUpb = -1;
	private int intOldPos = -1;

	public MessageWidget(Composite parent, int style) {
		super(parent, style);
		display = parent.getDisplay();
		setLayout(new FillLayout(SWT.HORIZONTAL));
		//
		pbMsg = new ProgressBar(this, SWT.NONE);
		pbMsg.addPaintListener(new PaintListener() {
			public void paintControl(PaintEvent e) {
				if (strMessage == null || strMessage.length() == 0) return;
				e.gc.setFont(display.getSystemFont());
				e.gc.setForeground(getForeground()); // set text color to widget foreground color

				Rectangle rec = pbMsg.getBounds();
				e.gc.drawString(strMessage, rec.x + 5, (rec.height - e.gc.getFontMetrics().getHeight()) / 2, true);
			}
		});
	}

	@Override
	public void setBackground(Color c) {
		super.setBackground(c);
		pbMsg.setBackground(c);
	}

	/**
	 * Sets the new message
	 */
	public void setMessage(String strMessage) {
		setMessage(strMessage, 0, 0, 0);
	}

	/**
	 * Sets the new message and updates the progressbar.
	 */
	public void setMessage(String strMessage, int lwb, int pos, int upb) {
		this.strMessage = strMessage;
		if (lwb != intOldLwb) {
			pbMsg.setMinimum(lwb);
			intOldLwb = lwb;
		}
		if (upb != intOldUpb) {
			pbMsg.setMaximum(upb);
			intOldUpb = upb;
		}
		if (pos != intOldPos) {
			pbMsg.setSelection(pos);
			intOldPos = pos;
		}
		while (display.readAndDispatch()) {}
	}
}
 

Neue Themen


Zurück
Oben