[SWT] Layout & Tabs, kann mir da einer Helfen?

Luxor

Mitglied
Hallo,

bis jetzt habe ich im Internet nur einfache Beispiele mit Tabs gefunden, ich möchte aber mehrere Composite in ein Gridlayout legen und eine Position enthält ein Tab(-folder) genau dieser aber Beansprucht mehr Platz als notwendig. Wenn ich bei den Tabs eine ScrolledComposite verwende habe ich das Problem dass ich für setMinSize(width,height) einen xfach grösseren Wert für den tatsächlich benötigten Platz angebe. Ich würde gerne aber die ScrolledComposite nur verwenden wenn der verbrauchte Platz grösser des verbrauchten Platzes der EltenComposite ist.
Kann mir da einer Helfen ?
Code:
package tabfolderexample;
import java.util.Random;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;

public class Swttab {
	private Display display;
	private Shell toplvlshell;
	private Menu menuBar;
	private TabFolder folder;

	public static void main(String[] args) {
		new Swttab();
	}
	public Swttab() {
		display = new Display();
		toplvlshell = new Shell(display);
		toplvlshell.setText("Tabfolderexample");

		toplvlshell.setLayout(new GridLayout(2, false));
		GridLayout gridlayout = new GridLayout(1, false);
		GridData griddata = new GridData(GridData.FILL_HORIZONTAL);
		toplvlshell.setLayoutData(griddata);

		Composite compo1 = new Composite(toplvlshell, SWT.BORDER);
		Composite compo2 = new Composite(toplvlshell, SWT.BORDER);

		folder = new TabFolder(compo1, SWT.BORDER);
		folder.setLayout(new FillLayout());
		for (int i = 1; i < 11; i++) {
			Composite page1 = createTabPage(folder, "tab" + i);
		}
		compo1.setLayout(gridlayout);
		compo1.setLayoutData(griddata);

		GridLayout gridlayout2 = new GridLayout();
		gridlayout2 = new GridLayout();
		gridlayout2.numColumns = 1;
		GridData griddata2 = new GridData();
		griddata2.grabExcessHorizontalSpace = false;
		Button but = new Button(compo2, SWT.PUSH | SWT.BORDER);
		but.setText("Button");
		compo2.setLayout(gridlayout2);
		compo2.setLayoutData(griddata2);
		
		
		toplvlshell.setSize(640, 250);
		toplvlshell.open();
		while (!toplvlshell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}

	}
	private Composite createTabPage(TabFolder folder, String label) {
		TabItem tab = new TabItem(folder, SWT.BORDER);
		tab.setText(label);
		Composite page = new Composite(folder, SWT.BORDER);
		Random r = new Random();
		if (r.nextInt() % 2 == 0) {
			GridLayout gl = new GridLayout();
			gl.numColumns = 1;
			GridData gd = new GridData();
			gd.grabExcessHorizontalSpace = true;
			gd.grabExcessVerticalSpace = true;
			gd.horizontalAlignment = SWT.FILL;
			page.setLayout(gl);
			page.setLayoutData(gd);
			Button b = new Button(page, SWT.BORDER);
			b.setText("Button No 1");
			b.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					toplvlshell.setText("Button  was clicked");
				}
			});
			b.setFocus();
			b = new Button(page, SWT.BORDER);
			b.setText("Button No 2");
			b.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					toplvlshell.setText("Button No 2 was clicked");
				}
			});
		} else {
			GridLayout gl = new GridLayout();
			gl.numColumns = 1;
			GridData gd = new GridData();
			gd.grabExcessHorizontalSpace = true;
			gd.grabExcessVerticalSpace = true;
			gd.horizontalAlignment = SWT.FILL;
			page.setLayout(gl);
			page.setLayoutData(gd);
			Label label1 = new Label(page, SWT.BORDER);
			label1.setText("NoGUI --");

		}

		tab.setControl(page);
		return page;
	}
}
 
Keiner einen Plan ?
Durch sukzessive Approximation habe ich herrausgefunden wenn ich den TabFolder direkt auf die Shell lege belegt er nur den ihm zugewiesenen Platz.
Lege ich den TabFolder aber in eine Composite und überlasse den GridLayoutmanager seiner Arbeit wird der Composite als Grundlage zur Platzberechnung das ganze Fenster angenommen, obowhl rechts davon eine andere Composite steht.Hat da jemand eine Idee ?
 

Neue Beiträge

Zurück