Table wird nicht gelöscht (SWT)

chickenwings

Erfahrenes Mitglied
Hallo Experten,

mal wieder eine Frage bzgl. einer Table in SWT:
folgender Code baut mir eine Tabelle in der Suchergebnisse dargestellt werden:

Code:
public void Trefferliste(ResultSet result) throws SQLException{
		
	final Table table = new Table(groupTreffer, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
       
        table.removeAll();
        	
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        String[] titles = {"ID", "Name", "Vorname", "Ort"};
        
        for (int i = 0; i < titles.length; i++) {
            TableColumn column = new TableColumn(table, SWT.NONE);
            column.setText(titles[i]);
            column.setWidth(180);          
        }
      	 
        int numCols = result.getMetaData().getColumnCount();
        while (result.next()) {
        	
        	TableItem item = new TableItem(table,SWT.NONE);
        	for (int i=1; i<=numCols; i++) {
        		item.setText(i-1, result.getString(i));
        	}
   	} 
        
        for (int i = 0; i < titles.length; i++) {
            table.getColumn(i).pack();
        }
        
        table.setSize(table.computeSize(SWT.DEFAULT, 200));
        table.setLocation(15,30);  
}

Beim ersten Aufruf dieser Methode und Übergabe des ResultSets werden die Daten auch so wie gwünscht dargestellt. Ändere ich jetzt allerdings die Suchkriterien, so bleibt das alte Ergebnis erhalten. table.removeAll(); wird offensichtlich nicht ausgeführt bzw. hat die Ausführung keine Auswirkung. Was kann man da machen, jemand eine Idee?

Gruss
chickenwings
 
Also, habe eine Lösung gefunden:
ich baue in einer Methode erstmal die Tabelle auf, dann gehts.
Aber falls jemand noch Anmerkungen oder Anregungen hat, sind diese natürlich herzlich Willkommen.

chickenwings
 
Hallo Chickenwings,

hier wird per Button das Table neu generiert, es wird auch sofort aktualisiert.

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

public class TableGenerator {

	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setSize(480, 320);
		final Table table = new Table(shell, SWT.MULTI | SWT.BORDER
				| SWT.FULL_SELECTION);

		createTable(table);

		final Button btn = new Button(shell, SWT.BORDER);
		btn.setText("Change table");

		GridLayout gl1 = new GridLayout();
		gl1.numColumns = 1;
		GridData gData = new GridData(GridData.FILL_BOTH);
		table.setLayoutData(gData);
		gData = new GridData(GridData.FILL_HORIZONTAL);
		btn.setLayoutData(gData);

		shell.setLayout(gl1);

		btn.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				createTable(table);
			}

			public void widgetDefaultSelected(SelectionEvent e) {
			}
		});

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

	public static void createTable(Table table) {
		table.setLinesVisible(true);
		table.setHeaderVisible(true);

		while (table.getColumnCount() > 0)
			table.getColumn(0).dispose();
		table.removeAll();

		double c = Math.random();
		double r = Math.random();

		int columns = (int) ((c == 0.0 ? 1 : c) * 15);
		int rows = (int) ((r == 0.0 ? 1 : r) * 55);

		for (int i = 0; i <= columns; i++) {
			TableColumn column = new TableColumn(table, SWT.NONE);
			column.setText("Column: " + i);
		}

		for (int i = 0; i <= rows; i++) {
			TableItem item = new TableItem(table, SWT.NONE);
			for (int j = 0; j < columns; j++) {
				item.setText(j, "Zeile" + i + "Spalte" + j);
			}
		}
		for (int i = 0; i < columns; i++) {
			table.getColumn(i).pack();
		}
	}
}

Vg Erdal
 
Hi Erdal,

danke.
Aber was mich zur Zeit am Meisten wurm ist, daß ich nicht herausbekomme wie ich einen ReslutSet auf null abfrage. Wenn ich einen ResultSet result habe und ihn so abfrage if(result == null) wird ständig der else-Zweig aufgerufen. Definitiv ist die Tabelle leer.
Code:
...
       String statement = "select * from kunden where name = 'Z'";

	try {
		result = sqlstate.getKunden(statement);
		if(result == null){
		MessageBox messageBox = new MessageBox(getShell(),
                SWT.ICON_INFORMATION | SWT.OK);
		messageBox.setText("Hinweis zur Suchanfrage");
		messageBox.setMessage("Leider keine Übereinstimmungen gefunden.");
		messageBox.open();
	} else {
	        Trefferliste(result);
	}
...

mit result.wasNull() geht es auch nicht. Was kann man da machen? War gestern noch der Meinung, daß es funktionierte. Eine Idee?

Gruss
André
 
hmm,

also es ist ja so, daß die While Schleife schon Bestandteil ist, aber erst in der ausgelagerten Methode. Dort hinverlagert hilft es aber auch nicht.

Wenn ich das ResultSet von meiner SQL-Abfrage-Methode zurückbekomme, möchte ich es schon auswerten.

Gruss
André
 
Meines Erachtens macht es hier keinen Sinn nach null zu fragen. Versuchs mal mit:
if (!rs.isLast())
...
else ...

Vg Erdal
 
Ja, Du hast recht, es macht keinen Sinn nach null abzufragen, da null definitiv nicht enthalten ist, auch wenn das ResultSet leer ist.
Dein Vorschlage geht leider auch nicht.

Aber:
Code:
if(result.next() == false){
	MessageBox messageBox = new MessageBox(getShell(),  
        SWT.ICON_INFORMATION | SWT.OK);
	messageBox.setText("Hinweis zur Suchanfrage");
	messageBox.setMessage("Leider keine Übereinstimmungen gefunden.");
	messageBox.open();
} else {
	result.beforeFirst();
	Trefferliste(result);
        result.close();
So frage ich also nach, ob es ein nächstes Element überhaupt gibt und setze im positiven Fall den internen Zeiger wieder vor das erste Element. Ansonsten wird das erste ignoriert.

Gruss
André
 
Zurück