SWT Table Größen verändern

Swoop

Gesperrter Benutzer
Hallo allerseits,
ich suche eine Möglichkeit bei einer Tabelle die Col width zu verändern... Das alles ist ja kein Problem solang die Überschriften angezeigt sind! Allerdings sollte bei mir die Überschriften der Tabelle ausgeblendet sein...

Gibt es eine Möglichkeit beim Markieren und Verschieben der Zellenlinien die Tabelle zu verändern?!
 
Die Änderung der Spaltenbreite per Maus ist in der JTable nur über die Header möglich. Ohne Header musste man sich vermutlich selbst was mit MouseListener und MouseMotionListener basteln. z.B nach mousePressed() berechnen, ob im die Mouse im Bereich zwischen zwei Spalten gedrückt wurde, falls ja anhand der Information aus mouseDragged() die Spaltenbreite entsprechend mit ziehen.
 
ok ... Schade, mit sowas habe ich schon gerechnet! Dann wird es doch viel mehr arbeit als anfangs gedacht hatte gehofft es gibt hier irgendeine Lösung... komisch dass das Problem so selten Auftritt^^
 
Sorry, sehe gerade, dass das Thema als SWT gekennzeichnet ist. Mit SWT hatte ich noch nie was zu tun, kann sein, dass es da bereits solche Implementierungen gibt. Ansonsten sollte das mittels MouseListenern umzusetzen ein nicht allzu grosser Aufwand sein.
Ich selbst hatte nie das Bedürfnis, da ich Tabellen bisher immer mit Spaltenüberschriften genutzt habe.
 
hmm naja ... ich habe aber auch nichts gefunden im netz und such mich tot^^

naja also zum hintergrund ... ich hab zwei Tabellen die Farblich hinterlegt sind und die erste Tabelle sind die Überschriften der zweiten Tabelle ! Praktisch sind diese genau übereinander^^

Naja dann hab ich noch eine frage und zwar werden die Tabellen immer beim Erzeugen mit 3 Spalten angezeigt ... Jetzt würde ich aber gerne nur eine einzige Zeile anzeigen lassen... Ich habe die Höhe der Tabelle von meinem Layout auf 0 gesetzt ... aber es zeigt immer noch etwas von der zweiten Zeile an... Gibt es vllt da schon irgendwie eine Möglichkeit, dass er nur die Zeilen anzeigt die auch mit TableItems befüllt sind ?!

Grüße Swoop
 
hmm naja ... ich habe aber auch nichts gefunden im netz und such mich tot^^

naja also zum hintergrund ... ich hab zwei Tabellen die Farblich hinterlegt sind und die erste Tabelle sind die Überschriften der zweiten Tabelle ! Praktisch sind diese genau übereinander^^

Naja dann hab ich noch eine frage und zwar werden die Tabellen immer beim Erzeugen mit 3 Spalten angezeigt ... Jetzt würde ich aber gerne nur eine einzige Zeile anzeigen lassen... Ich habe die Höhe der Tabelle von meinem Layout auf 0 gesetzt ... aber es zeigt immer noch etwas von der zweiten Zeile an... Gibt es vllt da schon irgendwie eine Möglichkeit, dass er nur die Zeilen anzeigt die auch mit TableItems befüllt sind ?!

Grüße Swoop
Warum willst du 2 Tabellen übereinander legen? Wenn in der einen nur die Überschriften drin sind... hört sich strange an!!!

Check gar nicht was du vor hast... Mach ein KSKB!!!
 
Also ok !

hier ein KSKB. Ich denke so dürfte es verständlicher werden:

Java:
public class TestGUI
{
	private Shell shell;

	/**
	 * Runs the application
	 */
	public void run()
	{
		Display display = new Display();
		shell = new Shell(display);
		shell.setLayout(new GridLayout(1, false));
		shell.setText("Test");

		Table head = createTable();
		TableItem itemHead1 = new TableItem(head, SWT.NONE);
		itemHead1.setText(new String[] { "Vorname", "Nachname", "Ort" });
		itemHead1.setBackground(new org.eclipse.swt.graphics.Color(this.shell
				.getDisplay(), 115, 187, 255));
		TableItem itemHead2 = new TableItem(head, SWT.NONE);
		itemHead2.setText(new String[] { "Straße", "PLZ", "Land" });

		Table table = createTable();

		TableItem item1 = new TableItem(table, SWT.NONE);
		item1.setText(new String[] { "Tim", "Muster", "Krieger" });
		item1.setBackground(new org.eclipse.swt.graphics.Color(this.shell.getDisplay(),
				115, 187, 255));
		TableItem item12 = new TableItem(table, SWT.NONE);
		item12.setText(new String[] { "Im Ander", "73554", "Deutschland" });
		TableItem item2 = new TableItem(table, SWT.NONE);
		item2.setText(new String[] { "Max", "Werner", "Weitmars" });
		item2.setBackground(new org.eclipse.swt.graphics.Color(this.shell.getDisplay(),
				115, 187, 255));
		TableItem item22 = new TableItem(table, SWT.NONE);
		item22.setText(new String[] { "Landerstr", "73880", "Deutschland" });
		TableItem item3 = new TableItem(table, SWT.NONE);
		item3.setText(new String[] { "Reene", "Miller", "Lorch" });
		item3.setBackground(new org.eclipse.swt.graphics.Color(this.shell.getDisplay(),
				115, 187, 255));
		TableItem item32 = new TableItem(table, SWT.NONE);
		item32.setText(new String[] { "Teckstr", "63529", "Deutschland" });

		// label.setFont(label.getFont().get);
		shell.pack();
		
		shell.open();

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

	private Table createTable()
	{
		Table t = new Table(shell, SWT.BORDER);

		TableColumn tc1 = new TableColumn(t, SWT.CENTER);
		TableColumn tc2 = new TableColumn(t, SWT.CENTER);
		TableColumn tc3 = new TableColumn(t, SWT.CENTER);
		// tc1.setText("Vorname");
		// tc2.setText("Nachname");
		// tc3.setText("Adresse");
		tc1.setWidth(70);
		tc2.setWidth(70);
		tc3.setWidth(80);
		t.setHeaderVisible(false);
		t.setLinesVisible(true);

		return t;
	}

	public static void main(String[] args)
	{
		new TestGUI().run();
	}

Im Anhang ist noch ein Screenshot ..

Edit:

Kurze Erklärung noch:

Es soll ein programm werden, dass CSv Dateien ausliest und man sie auch damit bearbeiten kann... Es gibt CSV Files die haben verschiedene Bedeutungen und beginnen mit einem Bezeichern ... zb K ...
diese sollen Farblich anders hervorgehoben werden und mit anderen Überschriften versehen werden...
Das heißt also wenn ich eine CSV Datei habe, die K-Sätze, A-Sätze und H-Sätze hat müssen drei Überschriften gegeben sein und drei Farben verwendet werden...
 

Anhänge

  • kskb.png
    kskb.png
    3 KB · Aufrufe: 40
Zuletzt bearbeitet:
Ein paar Dinge:
1) Versuch es vielleicht über einen Dialog - in Eclipse hat man auch einige Dialoge (z.B. Tasks - dort rechts auf das Menü, und "Columns..." anwählen), mit denen man Spalten aus und einblenden kann und auch in der Breite verstellen kann (ersteres hab ich zwar aufgrund eines SWT-Bugs(???) nicht hinbekommen, zweiteres sollte aber gut umzusetzen sein)
2) Ich versteh den Aufbau deiner GUI nicht wirklich... Warum bitte einen Datensatz auf zwei Zeilen verteilen, wie in deinem Beispiel - also wäre ich Nutzer des Programms würde ich die Hände über'm Kopf zusammenschlagen. Nutz lieber die Idee des Master-Details, das fände ich persönlich besser.

BTW: Willst du - wie in deinem Beispiel - wirklich direkt auf Tables arbeiten? Nimm doch lieber einen TableViewer...
 
Ein paar Dinge:
1) Versuch es vielleicht über einen Dialog - in Eclipse hat man auch einige Dialoge (z.B. Tasks - dort rechts auf das Menü, und "Columns..." anwählen), mit denen man Spalten aus und einblenden kann und auch in der Breite verstellen kann (ersteres hab ich zwar aufgrund eines SWT-Bugs(???) nicht hinbekommen, zweiteres sollte aber gut umzusetzen sein)
Wie meinst du das über einen Dialog ?! Das Porgramm muss später auf einem Server ohne Eclipse laufen ...

2) Ich versteh den Aufbau deiner GUI nicht wirklich... Warum bitte einen Datensatz auf zwei Zeilen verteilen, wie in deinem Beispiel - also wäre ich Nutzer des Programms würde ich die Hände über'm Kopf zusammenschlagen. Nutz lieber die Idee des Master-Details, das fände ich persönlich besser.
Master Details ?! Was ist damit gemeint ?
Also ich weis nicht obs so wirklich rüberkommt wie ich mir das Vorstelle aber ich dachte eig es ist die beste Art dies darzustellen was ich in den Daten bekomme ...

Code:
K;10b;31;12-14
S;Hans;13;Bettringen;TheaterAG
S;Roland;13;Bettringen;SportAG
S;Arthur;12;Waldstetten;InternetAG
S;Lotz;14;Waldstetten;SportAG
F;M;Mo 12Uhr,Di 13 Uhr
F;D;Di und Mi 14 Uhr
F;E;Fr 10 Uhr
K:9a;10-11
S;Kevin;11;Bettringen;KochAG
S;Edin;10;Bettringen;TheaterAG
S;Lukas;11;Bargau;SportAG
S;Jan;10;Bargau;InternetAG
F;IT;Don 16 Uhr
F;Denglish;Mo und Fr 11 Uhr
So sieht die CSV-Datei Beispielshaft aus ...

BTW: Willst du - wie in deinem Beispiel - wirklich direkt auf Tables arbeiten? Nimm doch lieber einen TableViewer...
Naja ich hab jetzt eig alles sehr gut ohne einen TableViewer gelöst und habe nicht vor ihn eig einzubauen!... Außerdem ist das beispiel oben nur ein kurz zusammen geschriebenes um das Problem etwas darzustellen...
 
Ok, fangen wir hinten an:
Ich würde dir dennoch einen TableViewer empfehlen, weil er sehr viel Arbeit abnehmen kann und das Handling imho besser ist. Man wirft ihm eine Liste (von z.B. CSVLine Objekten) rein - je nachdem, mit welchen Objekten du das intern händelst - und der Viewer stellt es mit wenigen Handgriffen dar. ohne TableItem geschubse und sich um mehrere Listener zu kümmern, etc. Im Gegenteil, es kommen gleich noch Interfaces für Doppel-Klick, und markierte Auswahl (u.a.) sowie einfach zu implementierende Filter, Sortierer u.ä. mit...
Ob du das im Endeffekt machst, ist natürlich deine Sache, aber wenn du deine API halbwegs übersichtlich hingemeißelt hast, sollte es nicht so schwer umzustellen sein (auch wenn ich vielleicht leicht reden habe, denn ich arbeite nur direkt mit der Eclipse API und da füge ich lediglich ein Plugin hinzu).

Das Format deiner CSV-Datei finde ich etwas kryptisch und werde da nicht schlau draus, aber wenn es dir so passt, ist's wohl ok. Ich könnte jetzt natürlich XML im allgemeinen empfehlen, zumal es in Java direkt JAXB gibt, womit man XML direkt in einen schön zu benutzenden Objektbaum umwandeln kann (und zurück). Voraussetzung ist, dass du XML Schemas erstellen kannst, den rest macht der xjc Mapper. Man kann in dem Fall sicher auch immer EMF empfehlen, aber das mag hier auch eher mit Kanonen auf Spatzen geschossen sein! ;-)

Master-Details findest du in diversen Editoren, wie etwa dem Plugin-Editor von Eclipse: Recht ist eine Tabelle/ein Baum, klickt man dort ein Element an, ändert sich links die Ansicht. So oder so ähnlich würde ich das Konzept in Kürze beschreiben.
In deinem Fall klickt man Beispielsweise ein Person an und sieht dann im Details-Block den Ort, aus dem sie stammt.

Zum Dialog: Du sagst, es muss auf einem Server laufen... Wie jetzt? Remote? Oder soll es eine Web-Anwendung sein?
Erst einmal kannst du mit der Eclipse-API natürlich auch Applikationen bauen, die nicht Eclipse benötigen... Ich bauen zum Beispiel eine eigene Plattform, unter der Eclipse-Equinox läuft, ich benutze nur keine Plugins aus der IDE, sondern baue meine eigenen.
Den Dialog kannst du aber - so oder so - auch einfach über eine Kontextmenü, das auf der Table sitzt erreichen - oder über einen Button - je nachdem, wie du es lieber machen willst.
 
So Hallo...

In der Tat ist der TableViewer besser... Ich benötige ihn hier einfach nicht 😀

Und die CSV Datei war nur eine selbst geschriebene sehr kurze und abgespeckte CSV-Datei ... das sollte nur ein kurzes schnelles slebstgeschriebenes Beispiel sein.
Der Grund warum ich das mach, dass ich hier immer wieder mit dummen sehr großen CSV-Dateien zu kämpfen habe in der ich immer eine ewigkeit benötige um mich zurecht zu finden! Die Master-Detail ansicht hab ich auch inzwischen gegoogelt und ist wohl die beste Möglichkeit. Allerdings möchte ich nicht weit von der CSV-Datei wegkommen, da ja nur Administratoren und ich (Entwickler) das Teil dann benützen und am besten auch Fehler in diesen CSV Datei erkennen und abändern sollen...
Die Wirklichen CSV-Dateien sind 10000 mal so lang und haben zwischen 30-50 Strichpunkte 😀 also es ist ein größeres Programm welches diese erstellt. XML kenn ich und benutz ich auch um meine Daten zu speichern aber an die Daten komm ich leider nur aus diesen CSV-Files...

Naja ich hab jetzt für beides eine Lösung gefunden:
Das Problem mit dem größe Verändern werde ich über Mouse-Listener lösen und das Problem mit der letzten Zeile hab ich behoben indem ich das Layout auf 0 gesetzt habe und falls mehr als nur ein Item in der Tabelle ist muss dieses Layout erhöht werden.

Grüße Swoop
 

Zurück
Oben