SWT refresh einer Tabelle

calmar

Mitglied
Hallo,

habe eine tabelle, in der ich ein set von objekten darstelle. solange ich ein set verwende funktioniert das refresh.

jetzt habe ich mir gedacht, es ist übersichtlicher, wenn ich die werte sortiere - ich übergebe jetzt eine liste mit den objekten nach einem kriterium sortiert.

wenn ich die tabelle aufmache sieht alles schön aus - aber wenn ich werte aus der tabelle entferne (funktion bei mir bei einem button hinterlegt) aktualisiert sich die tabelle nicht mehr:

hier meine relevanten codeteile:

Java:
	public void createTablePlaetze(Composite shell) {
		tableViewerPlaetze = new TableViewer(shell, SWT.BORDER
				| SWT.FULL_SELECTION);
		tableViewerPlaetze.getTable().setLayoutData(
				new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
		TableLayout layout = new TableLayout();
		layout.addColumnData(new ColumnWeightData(25, 100, true));
		layout.addColumnData(new ColumnWeightData(25, 100, true));
		layout.addColumnData(new ColumnWeightData(25, 100, true));
		layout.addColumnData(new ColumnWeightData(25, 100, true));
		tableViewerPlaetze.getTable().setLayout(layout);
		tableViewerPlaetze.getTable().setLinesVisible(true);
		tableViewerPlaetze.getTable().setHeaderVisible(true);

		tableViewerPlaetze.setContentProvider(new ArrayContentProvider());
		tableViewerPlaetze.setLabelProvider(new ITableLabelProvider() {

			@Override
			public Image getColumnImage(Object arg0, int arg1) {
				return null;
			}

			@Override
			public String getColumnText(Object element, int index) {
				Platz platz = (Platz) element;
				switch (index) {
				case 0:
					return platz.getReihe().getBezeichnung().toString();
				case 1:
					return platz.getNummer().toString();
				case 2:
					return platz.getKategorie().getBezeichnung().toString();
				case 3:
					int price = KundeEditor.this.calculateSinglePrice(platz);
					String singlePrice = "";
					singlePrice += price;
					return singlePrice;
				}

				return null;
			}

			@Override
			public void addListener(ILabelProviderListener listener) {
				// nothing to do
			}

			@Override
			public void dispose() {
				// nothing to do
			}

			@Override
			public boolean isLabelProperty(Object arg0, String arg1) {
				return true;
			}

			@Override
			public void removeListener(ILabelProviderListener arg0) {
				// nothing to do
			}
		});

		TableColumn colReihe = new TableColumn(tableViewerPlaetze.getTable(),
				SWT.LEFT);
		colReihe.setText("Reihe");
		TableColumn colNummer = new TableColumn(tableViewerPlaetze.getTable(),
				SWT.LEFT);
		colNummer.setText("Nummer");
		TableColumn colKategorie = new TableColumn(tableViewerPlaetze.getTable(),
				SWT.LEFT);
		colKategorie.setText("Kategorie");
		TableColumn colPreis = new TableColumn(tableViewerPlaetze.getTable(),
				SWT.LEFT);
		colPreis.setText("Preis");

		this.createSetTransaktionBackButton(shell);
		this.createDeletePlatzButton(shell);
		Label lblEmpty = new Label(shell,SWT.LEFT); 
		lblEmpty.setText("");
		lblEmpty = new Label(shell,SWT.LEFT); 
		lblEmpty.setText("");
		lblEmpty = new Label(shell,SWT.LEFT); 
		lblEmpty.setText("");
		this.createSellReservierungButton(shell);

Java:
this.createTablePlaetze(shell);
				
				IPlatzService ips = new PlatzService(); 
				//this.tableViewerPlaetze.setInput(ips.sortSetPlatz(tmpTransaktion.getPlaetze()));
				this.tableViewerPlaetze.setInput(tmpTransaktion.getPlaetze());
				shell.open();

bei der auskommentierten zeile uebergebe ich die liste mit den sortierten werten
Java:
	public void deletePlatzfromTrasaction(){
		ISelection selectionTransaktion =  this.tableViewerPlaetze.getSelection();
		Platz platz = (Platz) ((IStructuredSelection) selectionTransaktion).getFirstElement();
		log.debug("Chosen Platz: "+platz.toString()); 

		boolean delete = MessageDialog.openQuestion(KundeEditor.this.getSite()
				.getWorkbenchWindow().getShell(),
				"Entfernen best�tigen", "Wollen Sie den Platz " + platz.getNummer().toString()
				+ " wirklich entfernen?");
		if(delete == true){
			tmpPlaetze.add(platz);
			Set<Platz>  plaetze = tmpTransaktion.getPlaetze();
			plaetze.remove(platz);
			tmpTransaktion.setPlaetze(plaetze);
			tableViewerPlaetze.refresh(true);
			lblGesamtpreis.setText("Gesamtpreis der Reservierung: "+this.updatePreis(tmpTransaktion)); 
		}
	}

in dieser methode wird das refresh aufgerufen...

irgendwie sehe ich den fehler einfach nicht - bitte um hilfe!

danke!🙂
 
jetzt habe ich mir gedacht, es ist übersichtlicher, wenn ich die werte sortiere - ich übergebe jetzt eine liste mit den objekten nach einem kriterium sortiert.
Es ist nicht notwendig die Liste zu sortieren. Setze dem Viewer stattdessen einen Sorter.

wenn ich die tabelle aufmache sieht alles schön aus - aber wenn ich werte aus der tabelle entferne (funktion bei mir bei einem button hinterlegt) aktualisiert sich die tabelle nicht mehr:
Java:
            Set<Platz>  plaetze = tmpTransaktion.getPlaetze();
            plaetze.remove(platz);
            tmpTransaktion.setPlaetze(plaetze);
Ist plaetze die gleiche Instanz die du bei setInput übergeben hast?
Vermutlich nicht, daher hat der Viewer auch immer noch die gleiche Liste.
Mein Tipp, mach dein Modell von Anfang an mit EMF, dann hast du nicht nur ein besseres Modell, sondern du bekommst auch gleich einen ContentProvider und LabelProvider mit dazu der die Viewer automatisch aktualisiert wenn sich das Modell ändert.
Eclipse Modeling - EMF - Home
 

Neue Themen


Zurück
Oben