SWT:Tabelle auf Knopfdruck mit aktualisierten Daten zeichnen

Status
Nicht offen für weitere Antworten.

twobeers

Mitglied
ich habe es auch schon hier gepostet, allerdings nach einigen Tagen noch immer keine Antwort erhalten, darum möchte ich es auch in dieses Forum stellen und hoffe hier kann mir jemand weiterhelfen (das sollte bis morgen gehen .... 🙁 )

Ich bin ziemlich neu mit SWT und habe trotz intensiver Suche keine Lösung für mein Problem gefunden:

Schilderung des Problems:
ich habe einen Server, der über die SWT-GUI verschiedene Sachen angezeigt, so auch auf Knopfdruck eine Tabelle mit allen connecteten Clients inklusive Daten über die Clients.
Bei Klick des Buttons erscheint die Tabelle mit allen Einträgen aus dem Array mit den Clients - das funktioniert schon ganz gut!
Allerdings möchte ich bei jedem weitern Klick auf den Button die Tabelle mit aktualisierten Daten neu zeichen - und das schaffe ich nicht, bei jedem weiteren Klick auf den Button passiert leider nichts.

Hier mein Code:
Code:
buttonShowClients.addSelectionListener(new SelectionAdapter() {
  public void widgetSelected(SelectionEvent e) {
	Client[] clients = Tools.getClients();
	final Table tableClients = new Table(compositeTab1, SWT.BORDER | SWT.V_SCROLL);
	tableClients.setBounds(350,200,250,150);
	tableClients.setHeaderVisible(true);
	tableClients.setLinesVisible(true);
        tableClients.clearAll(); // das war ein Versuch
	final TableColumn colIP = new TableColumn(tableClients,SWT.LEFT);
	colIP.setWidth(80);
	colIP.setText("IP");
	final TableColumn colPort = new TableColumn(tableClients,SWT.LEFT);
	colPort.setWidth(50);
	colPort.setAlignment(SWT.CENTER);
	colPort.setText("Port");
	final TableColumn colStatus = new TableColumn(tableClients,SWT.LEFT);
	colStatus.setWidth(60);
	colStatus.setAlignment(SWT.CENTER);
	colStatus.setText("Status");
	final TableColumn colChat = new TableColumn(tableClients, SWT.LEFT);
	colChat.setWidth(60);
	colChat.setAlignment(SWT.CENTER);
	colChat.setText("Chat");
		
	for (int i=0;i<Tools.getCount();i++) {
		TableItem item = new TableItem(tableClients,SWT.NONE);
		item.setText(0, clients[i].clientAddress.toString());
		item.setText(1, new Integer(clients[i].port).toString());
		item.setText(2, clients[i].view);
		item.setText(3, new Boolean(clients[i].chat).toString());
       }	
       tableClients.redraw(); // das habe ich probiert
}
});

mit tableClients.redraw() und tableClients.clearAll() habe ich leider auch keine Ergebnisse erziehlt!

danke für alle Tipps und Hinweise!
Grüße, TwoBeers
 
SamHotte hat gesagt.:
Probier es mal mit tableClients.layout()

ich habe deine Idee mal an das Ende meines Codes (also nach tableClients.redraw() ) gesetzt und es bewirkt leider keine Änderung, die Tabelle wird leider nicht aktualisiert.
 
Weitere Versuche wären: tableClients.setLayout() irgendwann am Anfang setzen sowie ein pack() aufrufen - aber das scheint nicht der Fehler zu sein, denn ohne setLayout() solltest du gar nichts von der Table sehen. Vielleicht auch mal beim übergeordneten Composite ein layout() ?
 
ich habe am Ende meines Codes für den Button noch folgendes eingefügt, nachdem die Tabelle mit Inhalt aus dem Array gefüllt wurde - zum probieren:
Code:
tableClients.redraw();
tableClients.layout();
tableClients.update();
compositeTab1.layout();
myShell.layout();

hat leider auch nichts geändert - das gibt es ja nicht, dass kein doch kein so Problem sein, was verstehe ich da nicht?

Kann es an meiner Konstruktion liegen - ich verwende in meiner Shell 2 Tabfolder mit jeweils einem Composite, wobei der erste Composite die "berüchtigte" Tabelle einhält!

P.S.: was bringt eigentlich dieses .pack für Komponenten genau?
 
API schrieb zu org.eclipse.swt.widgets.Control.pack:
Code:
public void pack()
Causes the receiver to be resized to its preferred size. For a composite, this involves computing the preferred size from its layout, if there is one. 

Throws: 
SWTException - 
ERROR_WIDGET_DISPOSED - if the receiver has been disposed 
ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver

- entspricht ungefähr dem revalidate() bei Swing. Ist ein bisschen gefrickel im Vergleich. Muss jetzt leider weg, melde mich aber nachher nochmal.
 
hmm - hat denn niemand eine Idee was sonst noch machen könnte?
Würde es helfen, wenn ich meinen ganzen Code der GUI hier reinstelle - oder genügt nur das aktuelle Code-Fragement um das es hier geht?

Bitte um Hilfe!!
 
Leider hab ich meinen gesamten SWT-Code in der Arbeit, aber das mit unsichtbaren Komponenten hatte ich auch ein paar mal; meistens lag das am fehlenden setLayout() bzw. pack(), aber die hast du ja. Bin momentan leider wieder am Swing-frickeln, daher sind diese SWT-Sachen recht weit weg, und vor Montag komme ich auch an mein Buch nicht ran, sorry! Ich melde mich aber dann nochmal, versprochen!
 
SamHotte hat gesagt.:
Leider hab ich meinen gesamten SWT-Code in der Arbeit, aber das mit unsichtbaren Komponenten hatte ich auch ein paar mal; meistens lag das am fehlenden setLayout() bzw. pack(), aber die hast du ja. Bin momentan leider wieder am Swing-frickeln, daher sind diese SWT-Sachen recht weit weg, und vor Montag komme ich auch an mein Buch nicht ran, sorry! Ich melde mich aber dann nochmal, versprochen!

ich hoffe du hast nicht vergessen auf mich - denn ich habe leider noch immer keine Lösung gefunden!
Vielen Dank fürs Bemühen.
 
danke Hilfe von hier bin ich auf diese Lösung gekommen:

ich muss einfach die Tabelle schon beim erstellen der GUI erzeugen und dann einfach die items aktualisiern - so geht es falls es jemanden interessiert!

Code:
final Table tableClients = new Table(compositeTab1, SWT.BORDER | SWT.V_SCROLL);
tableClients.setBounds(350,200,250,150);
tableClients.setHeaderVisible(true);
tableClients.setLinesVisible(true);
final TableColumn colIP = new TableColumn(tableClients,SWT.LEFT);
colIP.setWidth(80);
colIP.setText("IP");
final TableColumn colPort = new TableColumn(tableClients,SWT.CENTER);
colPort.setWidth(50);
colPort.setText("Port");
final TableColumn colStatus = new TableColumn(tableClients,SWT.CENTER);
colStatus.setWidth(60);
colStatus.setText("Status");
final TableColumn colChat = new TableColumn(tableClients, SWT.CENTER);
colChat.setWidth(60);
colChat.setText("Chat");		
			
Button buttonShowClients = new Button(compositeTab1, SWT.PUSH);
buttonShowClients.setBounds(10,300,150,20);
buttonShowClients.setText("Show Connected Clients");
buttonShowClients.addSelectionListener(new SelectionAdapter() { 
	public void widgetSelected(SelectionEvent e) {
		tableClients.removeAll();
		System.out.println("Button Show Clients was pressed");
		for (int i=0;i<Tools.getCount();i++) {
			Client[] clients = Tools.getClients();
			if (!clients[i].view.equals("off")) { 
				TableItem item = new TableItem(tableClients,SWT.NONE);
				item.setText(0, clients[i].clientAddress.toString());
				item.setText(1, new Integer(clients[i].port).toString());
				item.setText(2, clients[i].view);
				item.setText(3, new Boolean(clients[i].chat).toString());
			}
		}
          } 		
});

Vielen Dank für deine Mühen SamHotte!!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben