SWT layout invalidieren in SWT?

Bernd Hohmann

Top Contributor
Ich hab eine Shell, darin ein GridLayout und darin ein Label sowie Progressbar.

Code:
	shlProgress = new Shell(SWT.BORDER | SWT.TITLE | SWT.PRIMARY_MODAL);
	shlProgress.setSize(318, 130);
	shlProgress.setMinimumSize(new Point(100, 50));
	shlProgress.setText("Progress");
	GridLayout gl_shlProgress = new GridLayout(1, false);
	gl_shlProgress.marginRight = 25;
	gl_shlProgress.marginBottom = 25;
	gl_shlProgress.marginTop = 25;
	gl_shlProgress.marginLeft = 25;
	shlProgress.setLayout(gl_shlProgress);
	// ###
	lblProgress = new Label(shlProgress, SWT.NONE);
	GridData gd_lblProgress = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
	gd_lblProgress.widthHint = 350;
	lblProgress.setLayoutData(gd_lblProgress);
	// ###
	pbProgress = new ProgressBar(shlProgress, SWT.NONE);
	pbProgress.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

Jetzt wird der Text des lblProgress zur Laufzeit grösser als der vorgesehene .widthHint = 350 und das Grid müsste daher komplett neu Layoutet werden.

Ein "shlProgress.layout(true);" oder "shlProgress.layout()" bringt aber nichts, alles bleibt auf alter Grösse.

Wo ist mein Denkfehler?

Kompletter Source zum spielen ist unten.

Bernd


Code:
package de.zwanzigeins.tagtaggo.widgets;

import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.graphics.*;

public class ProgressMessageBox {

	/**
	 * Launch the application.
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			ProgressMessageBox window = new ProgressMessageBox(Display.getDefault().getActiveShell());
			window.setText("ich bin eine überschrift");
			window.setMessage("message hier");
			window.open();
			String s = "lala";
			for (int i = 0; i < 100; i++) {
				Thread.sleep(100);
				window.setMessage("Zähler " + i + " " + s);
				window.setProgress(0, i, 100);
				s = s + "gugu!";
			}
			window.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	protected Shell shlProgress;
	protected Label lblProgress;
	protected ProgressBar pbProgress;

	private String strTitle = "";
	private String strMsg = "";
	private int intLwb = 0;
	private int intVal = 0;
	private int intUpb = 0;
	private final Shell shlParent;

	public ProgressMessageBox(Shell parent) {
		shlParent = parent;
	}

	public void close() {
		if (shlProgress != null) {
			shlProgress.close();
			run_dispatcher();
		}
	}

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shlProgress = new Shell(SWT.BORDER | SWT.TITLE | SWT.PRIMARY_MODAL);
		shlProgress.setSize(318, 130);
		shlProgress.setMinimumSize(new Point(100, 50));
		shlProgress.setText("Progress");
		GridLayout gl_shlProgress = new GridLayout(1, false);
		gl_shlProgress.marginRight = 25;
		gl_shlProgress.marginBottom = 25;
		gl_shlProgress.marginTop = 25;
		gl_shlProgress.marginLeft = 25;
		shlProgress.setLayout(gl_shlProgress);
		// ###
		lblProgress = new Label(shlProgress, SWT.NONE);
		GridData gd_lblProgress = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
		gd_lblProgress.widthHint = 350;
		lblProgress.setLayoutData(gd_lblProgress);
		// ###
		pbProgress = new ProgressBar(shlProgress, SWT.NONE);
		pbProgress.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

		// ... selbst
		pbProgress.setVisible(false);
		shlProgress.addListener(SWT.Close, new Listener() {
			public void handleEvent(Event e) {
				e.doit = false; // disable close
			}
		});

	}

	/**
	 * Open the window.
	 */
	public void open() {
		createContents();
		shlProgress.open();
		shlProgress.pack();

		// ... selbst
		if (shlParent != null) {
			Point pp = shlParent.getLocation();
			Rectangle pr = shlParent.getBounds();
			shlProgress.setLocation(pp.x + pr.width / 2 - shlProgress.getBounds().width / 2, pp.y + pr.height / 2 - shlProgress.getBounds().height / 2);
		}

		setText(strTitle);
		setMessage(strMsg);
		setProgress(intLwb, intVal, intUpb);
	}

	private void run_dispatcher() {
		while (shlProgress.getDisplay().readAndDispatch()) {}
	}

	public void setMessage(String str) {
		strMsg = str;
		if (shlProgress != null) {
			lblProgress.setText(strMsg);
			shlProgress.layout();
			run_dispatcher();
		}
	}

	public void setProgress(int lwb, int val, int upb) {
		intLwb = lwb;
		intUpb = upb;
		intVal = val;
		if (shlProgress != null) {
			pbProgress.setMinimum(intLwb);
			pbProgress.setMaximum(intUpb);
			pbProgress.setSelection(intVal);
			if (intVal != 0 || intLwb != 0 || intUpb != 0) pbProgress.setVisible(true);
			run_dispatcher();
		}

	}

	public void setText(String str) {
		strTitle = str;
		if (shlProgress != null) {
			shlProgress.setText(strTitle);
			run_dispatcher();
		}
	}
}
 

Sonecc

Gesperrter Benutzer
Ich verstehe jetzt nicht ganz dein Problem...

Deine Shell hat eine breite von 318 Pixeln. Dein Label hat eine breite von 350 pixeln. Damit ist das Label schon breiter als die Shell. Durch das shlProgress.pack(); wird die Shell dann so vergrößert dass das Label komplett reinpasst.
Die Shell erhält dabei eine breite von 400px. (25px an jeder seite durch das layout + 350 px vom Label).
Wird dein Text nun so groß, dass er nicht mehr in die 350px reinpasst, kann dies in der Shell auch nciht mehr dargestellt werden, da diese ja zu klein dafür ist.
Wenn du den pack() aufruf mal auskommentierst und mit der Initalgröße rumspielst (sie z.B. mal auf 1000 stellst) wirst du sehen, dass der text auch erst später abgeschnitten wird.
Es liegt also schlicht nicht an deinem Layout sondern an der Shellgröße.
 

Sonecc

Gesperrter Benutzer
Die Shellgröße hat mit dem Layout aber absolut nix zu tun. Das Layout ist dafür zuständig die Größe der Kinder einer Komponente zu verändern. Die größe ihres Besitzers ist gehört nicht in den Aufgabenbereich eines Layouts und wird daher auch von diesem nicht angepasst.

Wenn du tatsächlich die Größe deiner Shell an die Breite deines Textes anpassen willst, dann berechne diese Größe des Textes (Tipp: gc.textExtent()) und passe die Shell Größe selbst an.
Beachte aber, dass eine selbstwachsende Shell für den Anwender alles andere als angenehm ist.
Der normale Anwender kann eher damit leben dass der Text abgeschnitten wird (mit ... am Ende), als dass die Shell unkontrolliert größer wird. Zumal dann auch noch sichergestellt werden muss, dass die Shell nicht über die Grenzen des aktuellen Monitors hinauswächst.

Eine sinnvollere Alternative um den gesamten Text anzeigen zu können wäre, diesen in den Tooltip zu setzen, wenn du merkst, dass die Shellgröße nicht reicht und den Text im Label mittels ... abzuschneiden.
 

Bernd Hohmann

Top Contributor
Die Shellgröße hat mit dem Layout aber absolut nix zu tun.

Aber natürlich - sonst gäbe es ja nicht ".pack()" :eek: Mein Fehler war, da einen widthHint im GridLayout einzubauen, nimmt man den raus funktioniert auch .pack() wie es soll.

Beachte aber, dass eine selbstwachsende Shell für den Anwender alles andere als angenehm ist.

Jepp, da muss ich nochmal ran. Wahrscheinlich werde ich das so regeln, dass ich a) nur vergrössere (nie verkleinere) und b) einen Oberwert einführe.

Das werde ich aber dann an die Praxis anpassen.

Bernd
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
S Layout - Problem AWT, Swing, JavaFX & SWT 1
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
J ComboBoxModel addElement verändert Layout AWT, Swing, JavaFX & SWT 8
E Probelm mit Layout AWT, Swing, JavaFX & SWT 1
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
P Tipps für GUI-Layout AWT, Swing, JavaFX & SWT 2
M Passender Layout-Manager AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
N Swing Zweifarbiges Layout für den Filechooser AWT, Swing, JavaFX & SWT 12
B LayoutManager Card Layout AWT, Swing, JavaFX & SWT 2
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
R Welchen Layout Manager/ Wie strukturieren? AWT, Swing, JavaFX & SWT 14
J Layout: oben 20% unten 80% AWT, Swing, JavaFX & SWT 12
T Layout für Listendarstellung AWT, Swing, JavaFX & SWT 3
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
C LayoutManager Passendes Layout gesucht AWT, Swing, JavaFX & SWT 2
M Layout funktioniert nicht AWT, Swing, JavaFX & SWT 3
dzim Layout von Panes in JFX2 AWT, Swing, JavaFX & SWT 17
H Layout Idee AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
J LayoutManager Komponentenaustausch zerschießt Layout AWT, Swing, JavaFX & SWT 4
F Layout-Problem AWT, Swing, JavaFX & SWT 2
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
D Bild in JPanel verschiebt Layout. Wie fixieren? AWT, Swing, JavaFX & SWT 9
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
ARadauer Wenig Material zum Thema: Design, Layout, Usability von Swing Anwendungen AWT, Swing, JavaFX & SWT 11
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
G LayoutManager Layout welches von Links nach rechts anordnet mit TOP Alignment! AWT, Swing, JavaFX & SWT 5
A Best practice für konkretes Layout AWT, Swing, JavaFX & SWT 10
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
A Layout/JPanelgröße AWT, Swing, JavaFX & SWT 6
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
J LayoutManager Welchen Layout/Design-Manager? AWT, Swing, JavaFX & SWT 4
R Swing Layout setzen AWT, Swing, JavaFX & SWT 3
L Layout automatische Anpassung umgehen? AWT, Swing, JavaFX & SWT 5
A Problem mit Layout-Manager AWT, Swing, JavaFX & SWT 11
J Button Layout anpassen AWT, Swing, JavaFX & SWT 22
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
B Buttongröße im Layout AWT, Swing, JavaFX & SWT 4
B LayoutManager Layout Problem AWT, Swing, JavaFX & SWT 14
O LayoutManager Layout entwerfen AWT, Swing, JavaFX & SWT 3
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
C LayoutManager Layout und vergrößern des Frames AWT, Swing, JavaFX & SWT 5
E Swing Runde Buttons / Position eines Obj. im Layout AWT, Swing, JavaFX & SWT 7
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
A Ungewollte Layout änderungen AWT, Swing, JavaFX & SWT 3
A Suche: Eclipse-GUI-Layout AWT, Swing, JavaFX & SWT 5
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11
N Swing Layout positionieren AWT, Swing, JavaFX & SWT 2
B Methode setzt nicht das Layout in einer if-Abfrage AWT, Swing, JavaFX & SWT 13
H LayoutManager Dynamisches Layout AWT, Swing, JavaFX & SWT 3
M SWT Breite von Textfeld nur ohne Layout änderbar AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben