Brauche Denkansatz

chickenwings

Erfahrenes Mitglied
Hallo Forum,

bin noch nicht sehr firm was die Programmierung in Java angeht und daher noch etwas unsicher im Umgang mit Klassen, Vererbung, Instanzvariablen etc.
Aber folgende Idee versuche ich gerade umzusetzen:

Habe ein Tutorial in SWT gerade durchgearbeitet und wollte eine kleines Kundenanlege- und Bearbeitungsprogramm schreiben. Die Datenbankanbindung und Datenmanipulation funktioniert soweit. Jetzt dachte ich mir eine TabStruktur aufzubauen mit den Tabs Kundenliste und neuer Kunde als Anfang. Weiterhin überlegt ich, daß es doch sinnvoll wäre eine übergeordnete Klasse als Aufhänger für die shell und die Tabstruktur an sich und in den Unterklassen die Tabs zu konkretisieren und mit Daten zu füllen.

Einen Anfang habe ich auch, nur komme ich nicht weit, da es nur noch Fehler hagelt.
Nun meine Fragen: ist meine Überlegung sinnvoll?
Wie baue ich meine Oberklasse auf, damit ich auf die den Tabfolder zugreifen kann?
Wo muss ich main() berücksichtigen?

Wäre sehr dankbar über eine kurze Hilfestellung
chickenwings
 
Hallo,

ok, so ähnlich sollte die Oberklasse aussehen:
Code:
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;


public class ViewKundenTabs {

	public static void main (String args [])
	{ 
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setSize(800,600);
		shell.setLocation(10,10);
		shell.setText("Kundenbearbeitung");
		
		//Tab aufbauen
		TabFolder tabFolder = new TabFolder(shell,SWT.NONE);
		tabFolder.setBounds(5,5,785,565);
		
		shell.open();
		while(!shell.isDisposed())
			if(!display.readAndDispatch())
			display.sleep();
			display.dispose();
	}
}

eine der Unterklassen, für jeweils einen Tab etwa so:
Code:
import java.sql.*;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;


public class ViewTabKundenliste extends ViewKundenTabs {

	Composite addCust = new Composite(tabFolder,SWT.NONE);		
	Table table = new Table(addCust, SWT.BORDER | SWT.FULL_SELECTION);
	table.setBounds(20,30,250,420);
	table.setLinesVisible(true);
	table.setHeaderVisible(true);
	TableColumn name  = new TableColumn(table,SWT.LEFT);
	name.setText("Name");
	name.setWidth(120);
	TableColumn vorname  = new TableColumn(table,SWT.LEFT);
	vorname.setText("Vorname");
	vorname.setWidth(100);
	
	TabItem item1 = new TabItem(tabFolder,SWT.NONE);
	item1.setText("Kundenliste");
	item1.setControl(addCust);

}

Ich dachte natürlich, ich könnte auf die Objekte wie Tabfolder tabfolder aus der Oberklassen zugreifen, aber Fehlanzeige.

chickenwings
 
Hallo,

ich habe zwar gestern angefangen SWT zu lernen, aber schau mal ob du das in etwa so gemeint hast.

Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.*;

public class ViewKundenTabsUser {

	private Display display = new Display();

	private Shell shell = new Shell(display);

	private TabFolder tabFolder = new TabFolder(shell, SWT.NONE);

	public ViewKundenTabsUser() {
		shell.setSize(800, 600);
		shell.setLocation(10, 10);
		shell.setText("Kundenbearbeitung");

		// Tab aufbauen
		tabFolder.setBounds(5, 5, 785, 565);

		new ViewTabKundenliste();
		new ViewTabNeukundenEingabe();

		shell.open();
		while (!shell.isDisposed())
			if (!display.readAndDispatch())
				display.sleep();
		display.dispose();
	}

	public static void main(String args[]) {
		new ViewKundenTabsUser();
	}

	class ViewTabKundenliste extends ViewKundenTabs {

		private Table table = new Table(addCust, SWT.BORDER
				| SWT.FULL_SELECTION);

		private TableColumn name = new TableColumn(table, SWT.LEFT);

		private TableColumn vorname = new TableColumn(table, SWT.LEFT);

		private TabItem tab = new TabItem(tabFolder, SWT.NONE);

		public ViewTabKundenliste() {
			table.setBounds(20, 30, 250, 420);
			table.setLinesVisible(true);
			table.setHeaderVisible(true);

			name.setText("Name");
			name.setWidth(120);

			vorname.setText("Vorname");
			vorname.setWidth(100);

			tab.setText("Kundenliste");
			tab.setControl(addCust);
		}
	}

	class ViewTabNeukundenEingabe extends ViewKundenTabs {

		private Label label1 = new Label(addCust, SWT.NONE);

		private Text text1 = new Text(addCust, SWT.SINGLE);

		private Label label2 = new Label(addCust, SWT.NONE);

		private Text text2 = new Text(addCust, SWT.SINGLE);

		private TabItem tab = new TabItem(tabFolder, SWT.NONE);

		public ViewTabNeukundenEingabe() {
			tab.setText("Neukunden Eingabe");

			label1.setText("Name:");
			label2.setText("Adresse:");

			RowLayout rl = new RowLayout();
			rl.type = SWT.HORIZONTAL;

			addCust.setLayout(rl);

			tab.setControl(addCust);
		}
	}

	class ViewKundenTabs {

		protected Composite addCust = new Composite(tabFolder, SWT.NONE);

		public ViewKundenTabs() {
			addCust.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		}
	}
}


Vg Erdal
 
Hallo Erdal,

danke für Deine Antwort.
Die Idee ist richtig, jedoch funktioniert es leider nicht :-(.

Zunächst einige Fragen:

Ich habe das in verschiedene Klassen aufgeteilt. Mir erschliesst sich jedoch nicht die Funktion der Klasse ViewKundenTabs. Hier wird lediglich ein Composite definiert.
Ich habe die Definition des Composite nun in ViewKundenTabsUser mit aufgenommen, da diese doch die Startklasse darstellt. Genauso die Vererbung von ViewKundenTabs ist mir unklar, da so der Tabfolder, der in der Klasse ViewKundenTabsUser definiert wird, unbekannt ist. Ich habe einfach mal diese Klasse als Erbklasse angenommen.

Die Fehler sind somit alle raus, wenn ich das nun einmal laufen lassen, gibts einen Laufzeitfehler der Art: Invalid Thread access in main ?

Hast Du das zum Laufen gebracht?

Gruss
André
 
Hallo Andre,

also mein Code funktioniert bei mir problemlos. Starte es doch mal so ohne in verschiedene Klassen aufzuteilen. Ich werd dann heut abend schaun, wie man das in verschiedene Klassen splitten kann.

Dass mit der Vererbungsgeschichte war deine Idee ;) . Ich würde die gesamte GUI nie in der Hauptklasse meines Programms implementieren. Natürlich kommt es auch darauf an wie komplex und umfangreich die Anwendung wird. Ich bevorzuge jede GUI Einheit getrennt in ihren eigenen Klassen zu implementieren. Diese tue ich dann in einer Hauptklasse als Objekte zusammenbinden. Für einen einfachen Texteditor könnte das so sein:

class GUImain {

Editor editor = new Editor();
Menu menu = new Menu();
ToolBar tBar = new ToolBar();
StatusBar sBar = new StatusBar();

public GUImain () {
...
}

...

}

class Editor {

}

class Menu {

}

class ToolBar {

}

class StatusBar {

}

Je nach dem wie Umfangreich diese Klassen sind würde ich entscheiden ob ich sie als innere Klasse von GUImain implementiere oder getrennt als eigene Klassen.

Die Idee der Vererbung von ViewTabKundenliste ViewTabNeukundenEingabe von ViewKundenTabs hab ich zunächst deinem Beispiel entnommen. Meines Erachtens ist das ein guter Ansatz, denn es ist möglich das alle Tabs gemeinsamkeiten haben welche man nur einmal in ViewKundenTabs zu implementiert hat. Allerdings bin ich mit SWT noch nicht so sehr vertraut das ich dir jetzt sagen könnte ob das der eleganteste weg ist.

Weiß nicht wie das die SWT Gurus angehen würden? Vielleicht mal winke, winke, hallihallo SWT Profis :D , falls einer bissel langeweile hat und seine Idee postet möchte.


Vg Erdal
 
Du hast recht, so funktioniert es!

Damit kann ich schon mal arbeiten.
Werde auch versuchen es in mehrere Klassen aufzuteilen.
Du hast mir damit auf jedenfall sehr geholfen. Ich melde mich, wenn ich Fortschritte mache :-D.

Gruss
André
 
Hallo Andre,

hab ein vollständig neues Beispiel implementiert. Ich wollte eigentlich zunächst von TabFolder und TabItem ableiten und eigene Klassen schreiben. Allerdings hab ich bemerkt das das nicht möglich ist.

Also habe ich eine Superklasse TabSuper erstellt welche von Composite abgeleitet ist. Danach habe ich drei Klassen implementiert welche von diesem TabSuper abgeleitet sind (Tab1, Tab2, Tab3). Weiterhin habe ich eine weitere Klasse erstellt, welche Tab4 heißt und nicht von TabSuper sondern von Composite abgeleitet ist. D.h. die Einstellungen in TabSuper sind auch in Tab1,Tab2, Tab3 zu sehen. Schließlich habe ich dann alles in der Klasse AdressManager vereint.

Die Klassen sind jetzt getrennt.

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

public class AdressManager {

	public static final Display display = new Display();

	private Shell shell = new Shell(display);

	private TabFolder tFolder = new TabFolder(shell, SWT.NONE);

	private Label label = new Label(shell, SWT.BORDER);

	public AdressManager() {
		shell.setText("Adress Manager 2006");
		shell.setSize(600, 600);

		createTabFolder();
		label.setText("Statusbar: ... ");

		GridLayout gl1 = new GridLayout();
		gl1.numColumns = 1;
		GridData gData = new GridData(GridData.FILL_BOTH);
		tFolder.setLayoutData(gData);
		gData = new GridData(GridData.FILL_HORIZONTAL);
		label.setLayoutData(gData);

		shell.setLayout(gl1);

		shell.layout();
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();

	}

	public void createTabFolder() {
		TabItem tItem1 = new TabItem(tFolder, SWT.BORDER);
		TabItem tItem2 = new TabItem(tFolder, SWT.BORDER);
		TabItem tItem3 = new TabItem(tFolder, SWT.BORDER);
		TabItem tItem4 = new TabItem(tFolder, SWT.BORDER);

		Tab1 t1 = new Tab1(tFolder, SWT.NONE);
		Tab2 t2 = new Tab2(tFolder, SWT.NONE);
		Tab3 t3 = new Tab3(tFolder, SWT.NONE);
		Tab4 t4 = new Tab4(tFolder, SWT.NONE);

		tItem1.setText("SuperTab 1");
		tItem2.setText("SuperTab 2");
		tItem3.setText("SuperTab 3");
		tItem4.setText("ExtraTab 4");

		tItem1.setControl(t1);
		tItem2.setControl(t2);
		tItem3.setControl(t3);
		tItem4.setControl(t4);
	}

	public static void main(String[] args) {
		new AdressManager();
	}
}


Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;

public class TabSuper extends Composite {

	private Display display = AdressManager.display;

	public TabSuper(Composite parent, int style) {
		super(parent, style);
		
		this.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
		this.setToolTipText("Hallo TabSuper");
		this.setCursor(Cursor.win32_new(display,SWT.CURSOR_HAND));
	}	
}


Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;

public class Tab1 extends TabSuper {

	public Tab1(Composite parent, int style) {
		super(parent, style);

		FillLayout layout = new FillLayout();
		layout.type = SWT.VERTICAL;
		layout.marginHeight = 50;
		layout.marginWidth = 50;

		this.setLayout(layout);

		new Button(this, SWT.PUSH).setText("Button 1");
		new Button(this, SWT.PUSH).setText("Button 2");
		new Button(this, SWT.PUSH).setText("Button 3");
	}
}


Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;

public class Tab2 extends TabSuper {

	public Tab2(Composite parent, int style) {
		super(parent, style);

		RowLayout layout = new RowLayout();
		layout.type = SWT.HORIZONTAL;

		this.setLayout(layout);

		new Label(this, SWT.BORDER).setText("Label 1");
		new Label(this, SWT.BORDER).setText("Label 2 Label 2");
		new Label(this, SWT.BORDER).setText("Label 3 Label 3 Label 3");
	}
}

Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;

public class Tab3 extends TabSuper {

	public Tab3(Composite parent, int style) {
		super(parent, style);

		Text textArea = new Text(this, SWT.MULTI| SWT.V_SCROLL| SWT.H_SCROLL | SWT.BORDER);
		
		textArea.setBounds(50,50,300,300);
	}
}

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

public class Tab4 extends Composite {

	public Tab4(Composite parent, int style) {
		super(parent, style);

		Table table = new Table(this, SWT.MULTI | SWT.BORDER
				| SWT.FULL_SELECTION);
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		String[] titles = { " ", "C", "!", "Description", "Resource",
				"In Folder", "Location" };
		for (int i = 0; i < titles.length; i++) {
			TableColumn column = new TableColumn(table, SWT.NONE);
			column.setText(titles[i]);
		}
		int count = 128;
		for (int i = 0; i < count; i++) {
			TableItem item = new TableItem(table, SWT.NONE);
			item.setText(0, "x");
			item.setText(1, "y");
			item.setText(2, "!");
			item.setText(3, "this stuff behaves the way I expect");
			item.setText(4, "almost everywhere");
			item.setText(5, "some.folder");
			item.setText(6, "line " + i + " in nowhere");
		}
		for (int i = 0; i < titles.length; i++) {
			table.getColumn(i).pack();
		}
		table.setSize(table.computeSize(SWT.DEFAULT, 200));
	}
}


Vg Erdal
 
Zurück