TableView

Guten Abend

Ich habe mit FXML eine TableView erstellt und möchte diese Mit daten füllen.

Die Tabelle erkennt das in der ObservableList zwei Einträge sind, denn ich kann in der Table die ersten zwei Zeilen anklicken.

Nur stehen keine Werte drin! Jedoch die Lioste ist OK, diese hab ich überprüft:

Hier wir die Tabel im Controller initialiisert

	 * Wird aufgerufen sobald die view geladen ist
	 */
	@FXML
	private void initialize() {
		System.out.println("Kundenverwaltung geladen");

		// initialiseren der Tabelle
		id.setCellValueFactory(new PropertyValueFactory<KundenListe, Integer>("iId"));
		firma.setCellValueFactory(new PropertyValueFactory<KundenListe, String>("sFirma"));
		strasse.setCellValueFactory(new PropertyValueFactory<KundenListe, String>("sStrasse"));
		hausnummer.setCellValueFactory(new PropertyValueFactory<KundenListe, String>("sHausnummer"));
		plz.setCellValueFactory(new PropertyValueFactory<KundenListe, String>("sPlz"));
		ort.setCellValueFactory(new PropertyValueFactory<KundenListe, String>("sOrt"));
		tel.setCellValueFactory(new PropertyValueFactory<KundenListe, String>("sTel"));
		fax.setCellValueFactory(new PropertyValueFactory<KundenListe, String>("sFax"));
		homepage.setCellValueFactory(new PropertyValueFactory<KundenListe, String>("sHomepage"));
		archiv.setCellValueFactory(new PropertyValueFactory<KundenListe, Boolean>("bArchiv"));

		kundenTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
		
		// Listen for selection changes
		kundenTable.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<KundenListe>() {

			@Override
			public void changed(ObservableValue<? extends KundenListe> observable, KundenListe oldValue, KundenListe newValue) {
				System.out.println("Aenderungen Tabelle");
			}
		});
	}```

und hier befüllt:

```kundenTable.setItems(kundenModel.getKundenDaten());```

*** Edit ***

Ich habe mir die Antwort selbst gegeben, gemäss diesem Tutorial:

[http://docs.oracle.com/javafx/2/api/javafx/scene/control/TableView.html#!](http://docs.oracle.com/javafx/2/api/javafx/scene/control/TableView.html#!)

Die Liste Hab ich vollgendermassen angepasst:

```package ch.privat.listen;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class KundenListe {

	private StringProperty sFirma;

	private StringProperty sStrasse;

	private StringProperty sHausnummer;

	private StringProperty sPlz;

	private StringProperty sOrt;

	private StringProperty sTel;

	private StringProperty sFax;

	private StringProperty sHomepage;

	private BooleanProperty bArchiv;

	/**
	 * Konsturktor
	 * 
	 * @param id
	 * @param firma
	 * @param strasse
	 * @param hausnummer
	 * @param plz
	 * @param ort
	 * @param tel
	 * @param fax
	 * @param Homepage
	 * @param archiv
	 */
	public KundenListe(String firma, String strasse, String hausnummer, String plz, String ort, String tel, String fax, String homepage, Boolean archiv) {
		setsFirma(firma);
		setsStrasse(strasse);
		setsHausnummer(hausnummer);
		setsPlz(plz);
		setsOrt(ort);
		setsTel(tel);
		setsFax(fax);
		setsHomepage(homepage);
		setbArchiv(archiv);
	}

	/**
	 * 
	 * @return
	 */
	public String getsFirma() {
		return firmaProperty().get();
	}

	/**
	 * 
	 * @param sFirma
	 */
	public void setsFirma(String sFirma) {
		firmaProperty().set(sFirma);
	}

	/**
	 * 
	 * @return
	 */
	public StringProperty firmaProperty() {
		if (sFirma == null) {
			sFirma = new SimpleStringProperty(this, "sFirma");
		}

		return sFirma;
	}

	/**
	 * 
	 * @return
	 */
	public String getsStrasse() {
		return strasseProperty().get();
	}

	/**
	 * 
	 * @param sStrasse
	 */
	public void setsStrasse(String sStrasse) {
		strasseProperty().set(sStrasse);
	}

	/**
	 * 
	 * @return
	 */
	public StringProperty strasseProperty() {
		if (sStrasse == null) {
			sStrasse = new SimpleStringProperty(this, "sStrasse");
		}

		return sStrasse;
	}

	/**
	 * 
	 * @return
	 */
	public String getsHausnummer() {
		return hausnummerProperty().get();
	}

	/**
	 * 
	 * @param sHausnummer
	 */
	public void setsHausnummer(String sHausnummer) {
		strasseProperty().set(sHausnummer);
	}

	/**
	 * 
	 * @return
	 */
	public StringProperty hausnummerProperty() {
		if (sHausnummer == null) {
			sHausnummer = new SimpleStringProperty(this, "sHausnummer");
		}

		return sFirma;
	}

	/**
	 * 
	 * @return
	 */
	public String getsPlz() {
		return plzProperty().get();
	}

	/**
	 * 
	 * @param sPlz
	 */
	public void setsPlz(String sPlz) {
		plzProperty().set(sPlz);
	}

	/**
	 * 
	 * @return
	 */
	public StringProperty plzProperty() {
		if (sPlz == null) {
			sPlz = new SimpleStringProperty(this, "sPlz");
		}

		return sPlz;
	}

	/**
	 * 
	 * @return
	 */
	public String getsOrt() {
		return ortProperty().get();
	}

	/**
	 * 
	 * @param sOrt
	 */
	public void setsOrt(String sOrt) {
		ortProperty().set(sOrt);
	}

	/**
	 * 
	 * @return
	 */
	public StringProperty ortProperty() {
		if (sOrt == null) {
			sOrt = new SimpleStringProperty(this, "sOrt");
		}

		return sOrt;
	}

	/**
	 * 
	 * @return
	 */
	public String getsTel() {
		return telProperty().get();
	}

	/**
	 * 
	 * @param sTel
	 */
	public void setsTel(String sTel) {
		telProperty().set(sTel);
	}

	/**
	 * 
	 * @return
	 */
	public StringProperty telProperty() {
		if (sTel == null) {
			sTel = new SimpleStringProperty(this, "sTel");
		}

		return sTel;
	}

	/**
	 * 
	 * @return
	 */
	public String getsFax() {
		return faxProperty().get();
	}

	/**
	 * 
	 * @param sFax
	 */
	public void setsFax(String sFax) {
		faxProperty().set(sFax);
	}

	/**
	 * 
	 * @return
	 */
	public StringProperty faxProperty() {
		if (sFax == null) {
			sFax = new SimpleStringProperty(this, "sFax");
		}

		return sFax;
	}

	/**
	 * 
	 * @return
	 */
	public String getsHomepage() {
		return homepageProperty().get();
	}

	/**
	 * 
	 * @param sHomepage
	 */
	public void setsHomepage(String sHomepage) {
		homepageProperty().set(sHomepage);
	}

	/**
	 * 
	 * @return
	 */
	public StringProperty homepageProperty() {
		if (sHomepage == null) {
			sHomepage = new SimpleStringProperty(this, "sHomepage");
		}

		return sHomepage;
	}

	/**
	 * 
	 * @return
	 */
	public Boolean getbArchiv() {
		return archivProperty().get();
	}

	/**
	 * 
	 * @param bArchiv
	 */
	public void setbArchiv(Boolean bArchiv) {
		archivProperty().set(bArchiv);
	}

	/**
	 * 
	 * @return
	 */
	public BooleanProperty archivProperty() {
		if (bArchiv == null) {
			bArchiv = new SimpleBooleanProperty(this, "bArchiv");
		}

		return bArchiv;
	}

}

und die tabelle wird nun so initialisiert:

		
		// initialiseren der Tabelle

		firma.setCellValueFactory(new Callback<CellDataFeatures<KundenListe, String>, ObservableValue<String>>() {
			public ObservableValue<String> call(CellDataFeatures<KundenListe, String> p) {
				// p.getValue() returns the Person instance for a particular
				// TableView row
				return p.getValue().firmaProperty();
			}
		});

		strasse.setCellValueFactory(new Callback<CellDataFeatures<KundenListe, String>, ObservableValue<String>>() {
			public ObservableValue<String> call(CellDataFeatures<KundenListe, String> p) {
				// p.getValue() returns the Person instance for a particular
				// TableView row
				return p.getValue().strasseProperty();
			}
		});
		
		hausnummer.setCellValueFactory(new Callback<CellDataFeatures<KundenListe, String>, ObservableValue<String>>() {
			public ObservableValue<String> call(CellDataFeatures<KundenListe, String> p) {
				// p.getValue() returns the Person instance for a particular
				// TableView row
				return p.getValue().hausnummerProperty();
			}
		});
		
		plz.setCellValueFactory(new Callback<CellDataFeatures<KundenListe, String>, ObservableValue<String>>() {
			public ObservableValue<String> call(CellDataFeatures<KundenListe, String> p) {
				// p.getValue() returns the Person instance for a particular
				// TableView row
				return p.getValue().plzProperty();
			}
		});
		
		ort.setCellValueFactory(new Callback<CellDataFeatures<KundenListe, String>, ObservableValue<String>>() {
			public ObservableValue<String> call(CellDataFeatures<KundenListe, String> p) {
				// p.getValue() returns the Person instance for a particular
				// TableView row
				return p.getValue().ortProperty();
			}
		});
		
		tel.setCellValueFactory(new Callback<CellDataFeatures<KundenListe, String>, ObservableValue<String>>() {
			public ObservableValue<String> call(CellDataFeatures<KundenListe, String> p) {
				// p.getValue() returns the Person instance for a particular
				// TableView row
				return p.getValue().telProperty();
			}
		});
		
		fax.setCellValueFactory(new Callback<CellDataFeatures<KundenListe, String>, ObservableValue<String>>() {
			public ObservableValue<String> call(CellDataFeatures<KundenListe, String> p) {
				// p.getValue() returns the Person instance for a particular
				// TableView row
				return p.getValue().faxProperty();
			}
		});
		
		homepage.setCellValueFactory(new Callback<CellDataFeatures<KundenListe, String>, ObservableValue<String>>() {
			public ObservableValue<String> call(CellDataFeatures<KundenListe, String> p) {
				// p.getValue() returns the Person instance for a particular
				// TableView row
				return p.getValue().homepageProperty();
			}
		});
		
		archiv.setCellValueFactory(new Callback<CellDataFeatures<KundenListe, Boolean>, ObservableValue<Boolean>>() {
			public ObservableValue<Boolean> call(CellDataFeatures<KundenListe, Boolean> p) {
				// p.getValue() returns the Person instance for a particular
				// TableView row
				return p.getValue().archivProperty();
			}
		});```

Falls jemand noch tips oder so hat,  nehme ich diese gerne an

Hallo.
Ich denke dein Problem ist es, dass deine Spalten-Attribute ein Präfix haben, z.B. “sStrasse”. Die PropertyValueFactory arbeitet über die Namen. Wie genau müsste ich selbst nun nachschauen. Wenn du aber folgenden Code hast:

  myColumn.setCellValueFactory(new PropertyValueFactory<Kunde, String>("name"));

Dann braucht deine Klasse Kunde folgende Methode:

public class Kunde {
    ...
    public StringProperty nameProperty() {
        ...
    }
}

Bei muss der Teil “name” übereinstimmen.

Jap genau das hab ich so in meiner Kundeklasse geändert!

Vielend Dank für den tipp. Im moment ist es noch relativ schwierig bespiele im Nrtz zu finden über JavaFX…,

[QUOTE=headnut]
Im moment ist es noch relativ schwierig bespiele im Nrtz zu finden über JavaFX…,[/QUOTE]

Fang doch damit an :wink:

Du solltest noch einen Teil deines Java-Codes in die FXML-Datei auslagern:
[XML]











[/XML]
Der Sinn des Ganzen ist ja eine möglichst saubere Trennung von view (fxml) und controller (deine Java-Klasse).

@SirWayne , das werde ich! Nur muss ich zuerst selbst den besten Weg finden und die ganze geschichte komplett begreiffen.

Aber der Name in die FXML Datei auszulagern macht nur sinn wenn sich Tabelle zur Laufzeit nicht verändert oder?

Ist diese Frage an mich gerichtet? Dann muss ich leider gestehen, dass ich sie nicht wirklich begreife.
Wie allerdings schon von mir leicht angedeutet dient die FXML-Datei dazu, die UI zu bauen. Das ganze Verhalten der einzelnen Elemente der UI wird in deiner Controller-Klasse abgehandelt, und dazu zählt auch ein „verändern“ der Tabelle, wobei es bei sich bei „verändern“ nach meinem Verständnis um Dinge handelt wie Elemente zur Tabelle hinzufügen oder entfernen bzw. einzelne Attribute der Elemente zu bearbeiten.

Edit: Ich sehe gerade, dass sich mein Vorschlag weiter oben auf deinen ursprünglichen Entwurf bezog (1. Listing). Deine Überarbeitung benutzt jetzt ein Modell, dass laut Aussage der von Dir verlinkten API-Doc für folgendes vorgesehen ist:

TableView support for classes that don’t contain properties

Deine Modellklasse ist aber nach den JavaFX-Regeln konstruiert und verwendet properties - mich wundert es, dass das so überhaupt funktioniert.
Ich werde mir deinen Code noch etwas genauer anschauen und Dir dann noch ein paar Verbesserungsvorschläge machen. Poste doch mal bitte den kompletten Code deiner Controller-Klasse.

*** Edit ***

Ok, bin jetzt etwas schlauer.
Du solltest deine FXML-Datei so verändern wie von mir vorgeschlagen. Tabellenspalten, die Du im Controller benötigst, gibst Du über das Attribut fx:id einen Namen. Du benötigst aber wirklich nur die Tabellenspalten, die Du auch bearbeiten möchtest!
In deiner Controllerklasse kommst Du an die Spalten über die Annotation @FXML.

@FXML
private TableView<KundenListe> kundenTable;
@FXML
private TableColumn<KundenListe, Integer> id; //Würde ich idColumn nennen.

Das hast Du wahrscheinlich auch so gehandhabt.
Das ist fast schon alles. Jetzt kann man über kundenTable.getItems() Objekte aus der Tabelle entfernen oder hinzufügen. Wenn Du allerdings jetzt noch Werte der einzelnen Kundenlisten direkt in der Tabelle verändern möchtest, musst Du
a) die Tabelle editierbar machen - am Besten auch in der FXML-Datei. (Attribut editable=„true“)
b) bei den Spalten, die bearbeitbar sein sollen, die Standard-Tabellenzellen durch andere ersetzen. JavaFX bietet insgesamt 5 solcher „Custom“-Tabellenzellen an (wobei die ProgressBarTableCell ja eher Spielzeug ist), schau mal hier. Wie Du bemerken wirst, gibt es schon Lösungen für String- und Boolean-Werte sowie mit ChoiceBoxTableCell und ComboBoxTableCell Zellen zum Auswählen von Werten aus einer Liste. Für die in diesem Beispiel verwendete Tabellenspalte id, die ja einen Integerwert darstellt, musst Du Dir was eigenes basteln. Google mal nach NumberTableCell o.ä., man findet inzwischen doch schon einiges.

Ich habe mir das ganze angeschaut… Aber die TableView ist auch im JavaFX zu mächtig…

Muss mir das in aller Ruhe zu gemühte ziehen… Vielen Dank für deine Mühe

*** Edit ***

Vollgender Stand hab ich jetzt:

In der FXML hab ich in den Spalten follgendes angegeben:

[XML]




[/XML]

Die Liste hab ich so abgeändert, mit sämtliche setter und getter:


	private SimpleStringProperty sStrasse = new SimpleStringProperty("");

	private SimpleStringProperty sHausnummer = new SimpleStringProperty("");

	private SimpleStringProperty sPlz = new SimpleStringProperty("");

	private SimpleStringProperty sOrt = new SimpleStringProperty("");

	private SimpleStringProperty sTel = new SimpleStringProperty("");

	private SimpleStringProperty sFax = new SimpleStringProperty("");

	private SimpleStringProperty sHomepage = new SimpleStringProperty("");

	private SimpleBooleanProperty bArchiv = new SimpleBooleanProperty(false);```

Im Controller selbst ist jetzt nur noch: 

```	@FXML
	private TableView<KundenListe> kundenTable;

	@FXML
	private TableColumn<KundenListe, String> firma;

	@FXML
	private TableColumn<KundenListe, String> strasse;

	@FXML
	private TableColumn<KundenListe, String> hausnummer;

	@FXML
	private TableColumn<KundenListe, String> plz;

	@FXML
	private TableColumn<KundenListe, String> ort;

	@FXML
	private TableColumn<KundenListe, String> tel;

	@FXML
	private TableColumn<KundenListe, String> fax;

	@FXML
	private TableColumn<KundenListe, String> homepage;

	@FXML
	private TableColumn<KundenListe, Boolean> archiv;```

Und jedesmal wenn ich nun das Programm ausführe kommt:


PropertyValueFactory is not a valid type.



Wo hab ich überlegungsfehler drin?

Nur mal so aus Interesse hat nix mit deinem Problem zu tun. Wie fütterst du denn die Tabelle mit Daten. Also wie kommen Modeländerungen wie add,remove usw. in die Tabelle?

Das sieht mir danach aus, als würde in deiner FXML-Datei der folgende Import fehlen:
[XML]<?import javafx.scene.control.cell.PropertyValueFactory?>
[/XML]
In deiner Controller-Klasse fehlt noch das befüllen der Tabelle, zumindest hast Du den entsprechenden Code nicht gezeigt*:

private void initialize()
{
    ObservableList<KundenListe> items = FXCollections.observableArrayList();
    //Hier jetzt Objekte vom Typ KundenListe zu items hinzufügen.
    kundenTable.setItems(items);
}

Edit: Das wäre der Punkt, der auch SirWayne aufgefallen ist.

Ja das hab ich euch noch vorenthalten, tut mir leid.

Ich habe jetzt alles angepasst, auch die namen der Columns. Aktuell hab ich wieder das Problem das die Tabelle merkt dass sie zwei Einträge hat, man kann sie anklicken, nur steht kein Text in diesen! Die ObservableList jedoch hätte den Text.

Meine FXML:
[XML]






        <!-- Firma -->
        <TableColumn fx:id="firmaCol" editable="false" prefWidth="75.0" text="Firma">
        	<cellValueFactory>
     			<PropertyValueFactory property="sFirma" />
 			 </cellValueFactory>
        </TableColumn>
        
        <!-- Strasse -->
        <TableColumn editable="false" prefWidth="75.0" text="Strasse" fx:id="strasseCol">
        	<cellValueFactory>
     			<PropertyValueFactory property="sStrasse" />
 			</cellValueFactory>
        </TableColumn>
        
        <!-- Hausnummer -->
        <TableColumn editable="false" maxWidth="5000.0" minWidth="10.0" prefWidth="75.0" text="Nr." fx:id="hausnummerCol" >
        	<cellValueFactory>
     			<PropertyValueFactory property="sHausnummer" />
 			 </cellValueFactory>            
        </TableColumn>
        
        <!-- Plz -->
        <TableColumn editable="false" prefWidth="75.0" text="PLZ" fx:id="plzCol" >
        	<cellValueFactory>
     			<PropertyValueFactory property="sPlz" />
 			 </cellValueFactory>            
        </TableColumn>
        
        <!-- Ort -->
        <TableColumn editable="false" prefWidth="75.0" text="Ort" fx:id="ortCol" >
        	<cellValueFactory>
     			<PropertyValueFactory property="sOrt" />
 			 </cellValueFactory>            
        </TableColumn>
        
        <!-- Telefon -->
        <TableColumn editable="false" prefWidth="75.0" text="Tel. Zentrale" fx:id="telCol" >
        	<cellValueFactory>
     			<PropertyValueFactory property="sTel" />
 			 </cellValueFactory>            
        </TableColumn>
        
        <!-- Fax -->
        <TableColumn editable="false" prefWidth="75.0" text="Fax." fx:id="faxCol" >
        	<cellValueFactory>
     			<PropertyValueFactory property="sFax" />
 			 </cellValueFactory>            
        </TableColumn>
        
        <!-- Homepage -->
        <TableColumn editable="false" prefWidth="75.0" text="Homepage" fx:id="homepageCol" >
        	<cellValueFactory>
     			<PropertyValueFactory property="sHompage" />
 			 </cellValueFactory>            
        </TableColumn>
      </columns>
      <contextMenu>
        <ContextMenu>
          <items>
            <MenuItem mnemonicParsing="false" onAction="#kundeBearb" text="Bearbeiten" fx:id="MIPopUpTableBearbeiten" />
            <MenuItem mnemonicParsing="false" onAction="#kundeLoeschen" text="Löschen" fx:id="MIPopUpTableLoeschen" />
            <CheckMenuItem mnemonicParsing="false" onAction="#archivEin_Aus" text="Archiv" fx:id="MIPopUpTableArchiv" />
          </items>
        </ContextMenu>
      </contextMenu>
    </TableView>[/XML]

Meine Kundenliste, ich habe nicht alle setter und getter kopiert…:


	private SimpleStringProperty sStrasse = new SimpleStringProperty("");

	private SimpleStringProperty sHausnummer = new SimpleStringProperty("");

	private SimpleStringProperty sPlz = new SimpleStringProperty("");

	private SimpleStringProperty sOrt = new SimpleStringProperty("");

	private SimpleStringProperty sTel = new SimpleStringProperty("");

	private SimpleStringProperty sFax = new SimpleStringProperty("");

	private SimpleStringProperty sHomepage = new SimpleStringProperty("");

	private SimpleBooleanProperty bArchiv = new SimpleBooleanProperty(false);


	/**
	 * 
	 * @param id
	 */
	public void setiId(int id) {
		this.iId = id;
	}

	/**
	 * 
	 * @return
	 */
	public String getsFirma() {
		return sFirma.get();
	}```

Im moment wird die TableView über einen PropertyChangeEvent befüllt, das werde ich noch ändern. Jedoch ganz sicher erst nachdem die Table geladen ist:

```	/**
	 * Veränderungen mitbekommen
	 */
	@Override
	public void propertyChange(PropertyChangeEvent evt) {
		if (evt.getPropertyName().equals(Texte.changeKundenTable.toString())) {	
			kundenTable.setItems((ObservableList<KundenListe>) evt.getNewValue());
		}
	}```

Dazu musst Du uns auch noch den entsprechenden Code posten! Wo, wie, was klickst Du an?

Okey ich versuche es zu erklären:

In Zeile eins und Zwei sind Daten vorhanden, wenn ich mit der Maus darüber fahre werden diese selektiert:

Nur zeigt es mir die Daten nicht in de Tabelle an.

Die Restliche Tabelle hat keine Daten, wie es auch sein soll, und diese Zeilen werden auch nicht selektiert:

Du solltest dir das Databinding besser anschauen:

Wenn du es ganz einfach mit tabellen haben willst schaust dir EMF und JavaFX Binding an…
Total genial und einfach…

Ich sehe zwischen den drei gezeigten Bildern keinen Unterschied. Und Code sehe ich auch nicht.

@SirWayne Werd ich mir anschauen.

Doch du siehst unterschiede, bei den ersten beiden Bilder ist die Zeile unter der Maus selektiert. In den ersten beiden Zeilen sind die daten vorhanden werden aber nicht angezeigt.

und der Code ist im Post oberhalb, mehr hab ich nicht

Mehr hast Du nicht? Wie startest Du denn z.B. das Programm, wie wird deine fxml-Datei geladen usw…?

*** Edit ***

Dann benötigt deine Modell-Klasse noch zusätzlich getter für alle properties (nicht deren Werte), die wie folgt aufgebaut sein müssen:
Name der property (bspw. sFirma) + Property, die Methode sähe also in diesem Fall “public StringProperty sFirmaProperty()” aus.
Du bindest ja in der fxml-Datei mit dem tag eine PropertyValueFactory an deine Tabellenspalte, und diese factory sucht natürlich in deiner Modellklasse nach einer property, die Du ihr nennst:
[XML]
[/XML]
Wenn diese factory keine Methode findet, die nach der oben genannten Regel benannt wurde, kann sie keine Werte abbilden, so einfach ist das.

@Hobelhai
Genau das hab ich jetzt noch gemacht und es tut vielen Dank!

Nur jetzt schau ich mir das EMF an, das sieht extrem clever aus!

Noch eine kleine Frage, wenn ihr so eine Tabelle habt und eine Datenbank im Hintergrund, ändert ihr die Daten gleich in der Tabelle, oder im Hintergrund in der Liste und stellt diese wieder in der Table dar?

Ich mache inzwischen fast alle Zellen editierbar. So kann man, wie in deinem Fall, Kundendaten direkt in der Tabelle ändern. Wenn Änderung abgeschlossen (onEditCommit()) neuen Task starten und schauen, ob Datenbank oder Service korrekt gearbeitet haben (über Rückgaben), wenn Fehler aufgetaucht ist, wieder auf alten Wert zurücksetzen. Kann knifflig werden mit dem vorherigen Wert, musst Du ein bisschen tüfteln.

Dann brauchst du also die Liste auch nur um am Anfang die Daten anzuzeigen und den Rest geht direkt über die Table in die Datenbank.

Arbeitest du auch mit EMF? Ich danke das wird auch lange gehen bis ich es begriffen habe…