[SWT] TabFolder-Problem

tobias_petry

Erfahrenes Mitglied
Hallo,
auf Grund der Vorzüge des nativen Aussehens von SWT wollte ich mich da mal reinarbeiten, nun stehe ich nur von nem Problem was ich nicht verstehe.
Ich erzeuge einen Tab-Folder, der 3 TabItems hat, jedes TabItem bekommt mit setControl() eine Instanz der Group-Klasse zugewiesen, nun ist es aber so, dass er in jedem Tab Freiraum nach dem Group lässt, wo die anderen Tabs hinein passen würde :confused:

hier mal der Code, falls es hilft:
Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class EinstellungenGUI {
	private Display display;

	private Shell shell;

	public void initialize() {
		this.display = new Display();
		this.shell = new Shell(this.display);
		this.shell.setText("Einstellungen");
		this.createGUI();
		this.shell.pack();
		this.shell.open();
		while (!this.shell.isDisposed()) {
			if (!this.display.readAndDispatch())
				this.display.sleep();
		}
		this.display.dispose();
	}

	private void createGUI() {
		//Layout festlegen
		shell.setLayout(new GridLayout());
		//TabFolder erstellen
		TabFolder tabFolder = new TabFolder (shell, SWT.NONE);
		//EinstellungenTab erstellen
		TabItem tabAllgemein = new TabItem (tabFolder, SWT.NONE);
		tabAllgemein.setText("Allgemein");
		this.initializeAllgemeinTab(tabFolder,tabAllgemein);
		//ProxyTab erstellen
		TabItem tabProxy = new TabItem (tabFolder, SWT.NONE);
		tabProxy.setText("Proxy");
		this.initializeProxyTab(tabFolder,tabProxy);
		//PostTab erstellen
		TabItem tabPost = new TabItem (tabFolder, SWT.NONE);
		tabPost.setText("POST");
		this.initializePostTab(tabFolder,tabPost);
		tabFolder.pack ();
	}
	private void initializeAllgemeinTab(TabFolder folder,TabItem tab){
		folder.setLayout(new GridLayout());
		//AllgemeinGroup erstellen
		Group groupEinstellungen=new Group(folder,SWT.NONE);
		groupEinstellungen.setText("Allgemein");
		GridLayout layoutAllgemein=new GridLayout();
		layoutAllgemein.numColumns=2;
		groupEinstellungen.setLayout(layoutAllgemein);
		tab.setControl(groupEinstellungen);
		//Inhalt des Group erstellen
		Label labelURL=new Label(groupEinstellungen,SWT.NONE);
		labelURL.setText("URL: ");
		Text textURL=new Text(groupEinstellungen,SWT.BORDER);
		textURL.setText("http//localhost/slots/game.php");
		Label labelThreads=new Label(groupEinstellungen,SWT.NONE);
		labelThreads.setText("Threads: ");
		Spinner spinnerThreads=new Spinner(groupEinstellungen,SWT.BORDER);
		spinnerThreads.setMinimum(1);
		spinnerThreads.setMaximum(999);
		spinnerThreads.setSelection(10);
		Label labelWartezeit=new Label(groupEinstellungen,SWT.NONE);
		labelWartezeit.setText("Wartezeit: ");
		Spinner spinnerWartezeit=new Spinner(groupEinstellungen,SWT.BORDER);
		spinnerWartezeit.setMinimum(0);
		spinnerWartezeit.setMaximum(300);
		spinnerWartezeit.setSelection(1);
		Label labelRequest=new Label(groupEinstellungen,SWT.NONE);
		labelRequest.setText("Request: ");
		Combo comboRequest=new Combo(groupEinstellungen, SWT.READ_ONLY);
		comboRequest.add("GET",0);
		comboRequest.add("POST",1);
		comboRequest.select(0);
		Label labelAnzahl=new Label(groupEinstellungen,SWT.NONE);
		labelAnzahl.setText("Anzahl: ");
		Spinner spinnerAnzahl=new Spinner(groupEinstellungen,SWT.BORDER);
		spinnerAnzahl.setMinimum(-1);
		spinnerAnzahl.setMaximum(100000);
		spinnerAnzahl.setSelection(500);
		groupEinstellungen.pack();
	}
	
	private void initializeProxyTab(TabFolder folder,TabItem tab){
		//ProxyGroup erstellen
		Group groupProxy=new Group(folder,SWT.NONE);
		groupProxy.setText("Proxy");
		GridLayout layoutProxy=new GridLayout();
		layoutProxy.numColumns=2;
		groupProxy.setLayout(layoutProxy);
		tab.setControl(groupProxy);
		//Inhalt des Group erstellen
		Label labelProxy=new Label(groupProxy,SWT.NONE);
		labelProxy.setText("Proxy: ");
		Button buttonProxy=new Button(groupProxy,SWT.CHECK);
		Label labelProxyhost=new Label(groupProxy,SWT.NONE);
		labelProxyhost.setText("Host: ");
		Text textProxyhost=new Text(groupProxy,SWT.BORDER);
		textProxyhost.setText("hts-srv02");
		Label labelProxyport=new Label(groupProxy,SWT.NONE);
		labelProxyport.setText("Port: ");
		Text textProxyport=new Text(groupProxy,SWT.BORDER);
		textProxyport.setText("8080");
		Label labelProxyauth=new Label(groupProxy,SWT.NONE);
		labelProxyauth.setText("ProxyAuth: ");
		Button buttonProxyauth=new Button(groupProxy,SWT.CHECK);
		Label labelProxyuser=new Label(groupProxy,SWT.NONE);
		labelProxyuser.setText("ProxyUser: ");
		Text textProxyuser=new Text(groupProxy,SWT.BORDER);
		textProxyuser.setText("r1103");
		Label labelProxypass=new Label(groupProxy,SWT.NONE);
		labelProxypass.setText("ProxyPass: ");
		Text textProxypass=new Text(groupProxy,SWT.BORDER|SWT.PASSWORD);
		textProxypass.setText("r1103");	
		groupProxy.pack();
	}
	
	private void initializePostTab(TabFolder folder,TabItem tab){
		Button button1 = new Button (folder, SWT.PUSH);
		button1.setText ("post");
		tab.setControl (button1);			
	}
	

	public static void main(String args[]) {
		EinstellungenGUI gui = new EinstellungenGUI();
		gui.initialize();
	}

}

Der Code ist leider etwas unübersichtlich, und nicht zu schön wie vom Eclipse Gui-Builder (der bei mir bei SWT versagt).
Im Grunde erstellt die Methode createGUI() den TabFolder inkl. aller Tabs und ruft dann die privaten Methoden initializeAllgemeinTab() und initializeProxyTab() auf, die die Tabs mit Inhalt füllen sollen.


Wo wir gleich beim Thema sind, wollt eich noch Fragen, wie das mit dem disposen aussieht, muss ich jedes Widget/Composite einzeln disposen oder reicht es eigentlich auch einen Composite (meist die shell) zu disposen, da die ja alle ihre Widgets und Composites kennt.
 
Zuletzt bearbeitet:
Hallo,

lass mal das folder.setLayout(new GridLayout()); (erste Zeile der Methode initializeAllgemeinTab) weg.

Dass der Code so unübersichtlich aussieht, mag daran liegen, dass du keine Leerzeilen verwendest. Zwischen logisch zusammengehörigen Blöcken sollte man ab und an schon eine solche einstreuen :)

Grüße,
Matthias
 
Danke, *kiss*
Nur verstehen tue ich es nicht^^ Denn nach dem, was ich gelesen habe, braucht jedes Composite ein Layout um Daten anzuzeigen, warum dann der TabFolder nicht?

Das mit den Leerzeilen, werde ich mir zu Herzen nehmen ;)
Wo könnte ich denn genaue Informationen über das Handling von dispose finden? Alle schreiben nur, man müsste die Ressourcen disposen, dann disposen sie die Shell aber weiter wird nichts erklärt.

Danke schonmal Matthias

Edit: Note that although this class is a subclass of Composite, it does not make sense to set a layout on it. --> damit wäre ein Teil geklärt, hatte ich doch echt überlesen, oops
 
Wo könnte ich denn genaue Informationen über das Handling von dispose finden? Alle schreiben nur, man müsste die Ressourcen disposen, dann disposen sie die Shell aber weiter wird nichts erklärt.
Grundsätzlich sollte man alles, was man selber mit new angelegt hat, auch wieder mit dispose freigeben. Glücklicherweise werden beim Freigeben eines Widgets auch alle darin enthaltenen Unterwidgets freigegeben. Man muss also nicht zwingend für jedes Label und jeden Button einzeln dispose aufrufen, wenn man anschließend sowieso z.B. das Frame, zu dem sie gehören, freigibt. Im Grunde sollte es reichen, wenn man die entsprechende Shell oder das Display entsorgt. Aufpassen muss man allerdings bei Objekten, die nicht an ein Mutterwidget gebunden werden, wie zum Beispiel Font oder Color (wenn man sie explizit über new erzeugt). Solche sollte man selber entsorgen, wenn sie nicht mehr benötigt werden.

Grüße,
Matthias
 
k, vielen Dank.
Das erklärt warum alle Beispiele, die man im Netz findet nur die Shell disposen und bekräftigt meine These, na dann steht SWT ja (fast) nichts mehr im Weg *hehe*
Vielen Dank
 

Neue Beiträge

Zurück