SWT Resize und aktualisierung der gui

lumo

Top Contributor
Hallo

ich habe folgende dreistufiges gui.

einmal eine ScrolledComposite mit einer Composite als content.
dann kommt der Content rauf (eine Composite, auf die ich etwas zeichne und ein label darauf.
die composite berechnet selbst die größe die es braucht.

jetzt habe ich noch einen ControlListener der schaut wenns ein resize gibt...
so... jetzt starte ich das ganze teil und der content hat mal die richtige größe,
aber die scrolledComposite zeigt keine scrollbar.
wenn ich das fenster in der größe ändere poppt die scrollbar korrekt auf...
hab schon versucht das irgendwie auszulösen bin aber gescheitert...

hat jemand von euch eine idee??

hier der lauffähige code:


die app zum starten:
Java:
import org.eclipse.swt.SWT;

public class MapPreviewTest {

	protected Shell shell;

	/**
	 * Launch the application.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			MapPreviewTest window = new MapPreviewTest();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

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

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shell = new Shell();
		shell.setSize(450, 300);
		shell.setText("SWT Application");
		shell.setLayout(new GridLayout(1, false));

		MapsComposite maps = new MapsComposite(shell, SWT.NONE);
		maps.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
	}
}

die composite mit den einzelnen contents...
Java:
import java.util.ArrayList;

public class MapsComposite extends Composite implements ControlListener {

	private static final int VERTICAL_SPACING = 5;
	private Composite container;
	private ScrolledComposite sc;
	private List<MapComposite> maps = new ArrayList<MapComposite>();

	/**
	 * Create the composite.
	 * 
	 * @param parent
	 * @param style
	 */
	public MapsComposite(Composite parent, int style) {
		super(parent, style);
		GridLayout gridLayout = new GridLayout(1, false);
		gridLayout.horizontalSpacing = 0;
		gridLayout.marginHeight = 0;
		gridLayout.marginWidth = 0;
		gridLayout.verticalSpacing = 0;
		setLayout(gridLayout);

		sc = new ScrolledComposite(this, SWT.BORDER | SWT.V_SCROLL);
//		sc.addControlListener(this);
		sc.setAlwaysShowScrollBars(true);
		sc.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		sc.setExpandHorizontal(true);
		sc.setExpandVertical(true);

		container = new Composite(sc, SWT.NONE);
		GridLayout gl_container = new GridLayout(1, false);
		gl_container.verticalSpacing = VERTICAL_SPACING;
		gl_container.marginHeight = 0;
		gl_container.marginWidth = 0;
		gl_container.horizontalSpacing = 0;
		container.setLayout(gl_container);
		sc.setContent(container);

		createContents();
		addControlListener(this);
	}

	private void createContents() {
		String[] samples = new String[] { "bild1.jpg", "bild2.jpg",
				"bild3.jpg" };

		for (int i = 0; i < samples.length; i++) {
			MapComposite composite = new MapComposite(container);
			composite.setBackgroundImage(Resources.getImage("/res//",
					samples[i]));
			composite.setMapName(samples[i].replace(".jpg", ""));
			maps.add(composite);
		}
	}

	@Override
	protected void checkSubclass() {
		// Disable the check that prevents subclassing of SWT components
	}

	@Override
	public void controlMoved(ControlEvent e) {
	}

	@Override
	public void controlResized(ControlEvent e) {
		updateSC();
	}
	
	public void updateSC(){
		System.out.println("updateSC()");
		int height = 0;
		for (int i = 0; i < maps.size(); i++) {
			System.out.println(sc.getBounds().width);
			System.out.println("kid# "+i+".height = "+maps.get(i).getBounds().height);
			height += maps.get(i).getBounds().height;
		}
		height += VERTICAL_SPACING * (maps.size() - 1);
		sc.setMinHeight(height);
	}
}

der content
Java:
import org.eclipse.swt.SWT;

public class MapComposite extends Composite implements PaintListener,
		ControlListener {
	private Image bg;
	private GridData griddata;
	private float ar; // aspectRatio
	private Label lblMapName;

	/**
	 * Create the composite.
	 * 
	 * @param parent
	 * @param style
	 */
	public MapComposite(Composite parent) {
		super(parent, SWT.NO_BACKGROUND | SWT.DOUBLE_BUFFERED);
		this.griddata = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
		setLayoutData(griddata);
		setBackgroundMode(SWT.INHERIT_DEFAULT);
		GridLayout gridLayout = new GridLayout(1, false);
		gridLayout.horizontalSpacing = 0;
		gridLayout.verticalSpacing = 0;
		gridLayout.marginWidth = 0;
		gridLayout.marginHeight = 0;
		setLayout(gridLayout);

		Label lblSpacer = new Label(this, SWT.None);
		lblSpacer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1,
				1));
		lblSpacer.setVisible(false);

		lblMapName = new Label(this, SWT.NONE);
		lblMapName.setAlignment(SWT.CENTER);
		lblMapName.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
		lblMapName.setBackground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
		lblMapName.setFont(SWTResourceManager.getFont("Tahoma", 12, SWT.BOLD));
		lblMapName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
				false, 1, 1));
		lblMapName.setText("New Label");
	}

	public void setMapName(String string) {
		lblMapName.setText(string);
	}

	@Override
	protected void checkSubclass() {
		// Disable the check that prevents subclassing of SWT components
	}

	public void setBackgroundImage(Image image) {
		if (image != null && !image.isDisposed()) {
			bg = image;
			ar = (float) image.getBounds().height
					/ (float) image.getBounds().width;
			addControlListener(this);
			addPaintListener(this);
		}
	}

	@Override
	public void paintControl(PaintEvent e) {
		if (bg != null && !bg.isDisposed()) {
			Rectangle imageBounds = bg.getBounds();
			Rectangle clientArea = getBounds();
			e.gc.drawImage(bg, 0, 0, imageBounds.width, imageBounds.height, 0,
					0, clientArea.width, clientArea.height);
		}
	}

	@Override
	public void controlMoved(ControlEvent arg0) {
	}

	@Override
	public void controlResized(ControlEvent e) {
		updateMe();
	}
	
	public void updateMe() {
		griddata.widthHint = getBounds().width;
		griddata.heightHint = (int) ((float) getBounds().width * ar);
		griddata.minimumHeight = griddata.heightHint;
		setLayoutData(griddata);
		getParent().layout();
	}
}

was mache ich falsch??
 

Gossi

Bekanntes Mitglied
Java:
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
:)

So gehts zumindest bei ScrollPanes..
 

lumo

Top Contributor
was nir noch aufgefallen ist...
wenn ich
Java:
sc.setExpandVertical(true);
NICHT aufrufe, wird die scrollbar zwar korrekt angezeigt, aber die komponente drin nicht mehr... :(
 

Sonecc

Gesperrter Benutzer
Hab mal ein wenig rumprobiert. Aber das explizite Aufrufen von updateSC() oder layout() auf der MapsComposite führt dazu, dass der Inhalt anders gezeichnet wird, als bei einem Resize.
Das Problem ist, denke ich, dass deine MapComposites einen resize (aufgrund des Layouts der MapsComposite) erhalten, die MapsComposite selber aber nie resized oder layouted wird.
Die minimum height der Scrollbars wird also zu beginn inkorrekt gesetzt, weil die MapComposites noch gar nicht berechnet wurden.
Umgehen kann man das, indem du die MapComposites erzeugst bevor du die scrollpane und die composite (container) konfigurierst. Dann hast du aber den Effekt, den ich beschrieben habe, dass das Ergebnis anders ist, als bei einem resize
 

lumo

Top Contributor
und wie kann ich das so lösen, dass ich zb die sc fülle, später dann wieder die children dispose und neue dafür adde...

das problem liegt ja darin dass ich die höhe der componente erst zur laufzeit berechne... also der sc keine fixe größe mitgeben kann...

sonnige grüße aus mexico :)
 

Sonecc

Gesperrter Benutzer
Krasses Problem^^
Ich weiß ehrlich gesagt auch nicht so recht, wie man das sinnvoll lösen kann ;)

Viel Spass in Mexiko und bleib im sicheren Gebiet :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
M Swing Component Resize AWT, Swing, JavaFX & SWT 7
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
J Resize Node im BorderPane AWT, Swing, JavaFX & SWT 7
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
G Resize JFrame AWT, Swing, JavaFX & SWT 8
J Button vergrößert sich bei Fenster resize AWT, Swing, JavaFX & SWT 22
B JavaFX Scene Builder: resize funktioniert (meist) nicht AWT, Swing, JavaFX & SWT 6
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
HaukeG JavaFX JavaFX Resize und DragAndDrop eines Pane AWT, Swing, JavaFX & SWT 4
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
E JavaFX ScrollBar in TableView bei Column Resize AWT, Swing, JavaFX & SWT 2
T Bild drehen ohne Resize AWT, Swing, JavaFX & SWT 3
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
J resize - Label bleibt erst schwarz AWT, Swing, JavaFX & SWT 4
M Kein resize nach Component.setVisible() AWT, Swing, JavaFX & SWT 2
W Zeichnen in einem JFrame nach Resize AWT, Swing, JavaFX & SWT 7
M Seltsames Problem mit Resize eines Fensters und seiner Komponenten AWT, Swing, JavaFX & SWT 2
frankred Swing Canvas nach "Window-resize" neu Zeichnen lassen wegen Anzeigefehler AWT, Swing, JavaFX & SWT 4
TiME-SPLiNTER JLabel mit Icon & JFrame Resize AWT, Swing, JavaFX & SWT 5
J JTextArea verschwindet bei resize vom JFrame AWT, Swing, JavaFX & SWT 2
T JFrame resize AWT, Swing, JavaFX & SWT 2
1 Swing manual resize table column to min size AWT, Swing, JavaFX & SWT 2
W SWT Resize Tree-Element AWT, Swing, JavaFX & SWT 3
J Swing JFrame resize-Möglichkeiten AWT, Swing, JavaFX & SWT 10
R Resize Rectangle Problem AWT, Swing, JavaFX & SWT 3
A SWT Group und Column mit Resize ändern AWT, Swing, JavaFX & SWT 5
lumo Swing Resize löst probleme...? AWT, Swing, JavaFX & SWT 12
A Swing JPanel mit GridBagLayout Resize-problem AWT, Swing, JavaFX & SWT 1
hdi Swing JFrame Resize nicht in "Echtzeit" AWT, Swing, JavaFX & SWT 4
S Swing JTabbedPane: Resize des JFrame bei Tab wechsel AWT, Swing, JavaFX & SWT 8
B JInternalFrame resize event AWT, Swing, JavaFX & SWT 2
T nach resize transparent weg AWT, Swing, JavaFX & SWT 4
I SWT komponenten resize AWT, Swing, JavaFX & SWT 4
S JFrame instante Resize AWT, Swing, JavaFX & SWT 3
J resize eines Bildes automatisch berechnen lassen? AWT, Swing, JavaFX & SWT 2
D JInternalFrame iconified Position nach parent-resize AWT, Swing, JavaFX & SWT 2
F Resize in ScrollPane AWT, Swing, JavaFX & SWT 4
M nachträglicher resize von frame AWT, Swing, JavaFX & SWT 6
A resize ohne anddauerndes repaint AWT, Swing, JavaFX & SWT 2
T schönes Resize bei eigenem JFrame AWT, Swing, JavaFX & SWT 5
A resize ohne neu zu zeichnen AWT, Swing, JavaFX & SWT 8
C Swing und resize AWT, Swing, JavaFX & SWT 5
R Resize Problem bei JComponent AWT, Swing, JavaFX & SWT 2
P Resize von ScrollPane Inhalten AWT, Swing, JavaFX & SWT 2
A jtable resize AWT, Swing, JavaFX & SWT 6
R resize ImageIcon AWT, Swing, JavaFX & SWT 7
A GUI Komponenten verlieren Proportion bei resize (GBL) AWT, Swing, JavaFX & SWT 4
S Resize Event? AWT, Swing, JavaFX & SWT 2
K Image Resize + zu Byte [] konvertieren AWT, Swing, JavaFX & SWT 5
E Ärger mit ScrollPane, JTable und der Resize-Einstellung AWT, Swing, JavaFX & SWT 2
R JTable, automatischer resize der Zellen nach einer Eingabe AWT, Swing, JavaFX & SWT 4
J JFrame resize in Echtzeit AWT, Swing, JavaFX & SWT 3
B TableLayout - Resize Probleme AWT, Swing, JavaFX & SWT 2
R Autoresize eines Panel nach resize des Frames? AWT, Swing, JavaFX & SWT 3
M TableView + Datenbank Aktualisierung AWT, Swing, JavaFX & SWT 4
N Aktualisierung des Fensters AWT Java ohne Ruckeln AWT, Swing, JavaFX & SWT 3
P Aktualisierung von jLabel in jFrames AWT, Swing, JavaFX & SWT 8
O JavaFX Aktualisierung der Scene AWT, Swing, JavaFX & SWT 1
D Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse AWT, Swing, JavaFX & SWT 10
F Textfeld Währungszahlen und automatische Aktualisierung AWT, Swing, JavaFX & SWT 14
J Denkfehler bei Aktualisierung eines GUI AWT, Swing, JavaFX & SWT 4
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0
T Tetris - Gui Aktualisierung AWT, Swing, JavaFX & SWT 2
Y JFormattedTextfield - Aktualisierung und Beschränkung AWT, Swing, JavaFX & SWT 4
dzim TableView - keine Aktualisierung geänderter Items AWT, Swing, JavaFX & SWT 5
B Aktualisierung einer JList AWT, Swing, JavaFX & SWT 5
D JTable Aktualisierung nach hinzufügen eines Datensatzes AWT, Swing, JavaFX & SWT 7
B Problem bei der Aktualisierung des Frames AWT, Swing, JavaFX & SWT 6
B GUI Aktualisierung aus/und eventListener AWT, Swing, JavaFX & SWT 3
S Swing Aktualisierung Fensters AWT, Swing, JavaFX & SWT 7
K Modaler Dialog aber trotzdem Aktualisierung des MainFrames AWT, Swing, JavaFX & SWT 6
W Swing Aktualisierung des Bildes AWT, Swing, JavaFX & SWT 4
C JTable-Aktualisierung leidiges Thema AWT, Swing, JavaFX & SWT 18
Plastagen JTextArea CaretPosition Aktualisierung AWT, Swing, JavaFX & SWT 10
C permanente aktualisierung der Koordinaten der Maus auf einem Panel AWT, Swing, JavaFX & SWT 8
U JComboBox: (Vor)auswahl nach Aktualisierung AWT, Swing, JavaFX & SWT 2
kodela Swing Problem mit sofortiger Aktualisierung eine Textfeldes AWT, Swing, JavaFX & SWT 8
J Progressbar aktualisierung nach file übergabe AWT, Swing, JavaFX & SWT 7
T Aktualisierung einer JComboBox -> RepaintProblem! AWT, Swing, JavaFX & SWT 3
H Aktualisierung Gui AWT, Swing, JavaFX & SWT 5
G Bessere Aktualisierung eines Frames AWT, Swing, JavaFX & SWT 5
P Problem bei Aktualisierung eines JPanels AWT, Swing, JavaFX & SWT 2
S Aktualisierung der GUI AWT, Swing, JavaFX & SWT 6
S Aktualisierung in regelmäßigen Abständen AWT, Swing, JavaFX & SWT 2
L Problem mit der aktualisierung von JTree und Text Area AWT, Swing, JavaFX & SWT 22
F Aktualisierung während MOUSE_PRESSED AWT, Swing, JavaFX & SWT 4
M swt - problem mit aktualisierung des tableeditors AWT, Swing, JavaFX & SWT 3
G Aktualisierung der Ausgabe in SWT AWT, Swing, JavaFX & SWT 2
A Aktualisierung eines Bildes innerhalb einer Komponente AWT, Swing, JavaFX & SWT 7
A JTable - Aktualisierung und Spaltenbreite AWT, Swing, JavaFX & SWT 5
D Aktualisierung von GUI AWT, Swing, JavaFX & SWT 11
W JTextArea als Logausgabe und Aktualisierung AWT, Swing, JavaFX & SWT 3
C zu späte aktualisierung/repaint AWT, Swing, JavaFX & SWT 3
X Probleme mit aktualisierung durch Repaint() Methode AWT, Swing, JavaFX & SWT 3
R Thread-Problem (Aktualisierung von JLabel-Komponente) AWT, Swing, JavaFX & SWT 9
M problem mit textfield-aktualisierung AWT, Swing, JavaFX & SWT 4
G JScrollPane problem mit aktualisierung der daten AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben