# TableView - keine Aktualisierung geänderter Items



## dzim (18. Jun 2012)

Hi,

ich habe gerade festgestellt, dass mein TableView zwar neue Elemente korrekt wieder gibt, aber bei Änderung der Properties nichts anzeigt.

Hier der Code-Schnipsel, der universell für alles verwendet wird (triggern, wenn neue Items hinzu kommen, aber auch, wenn sich nur an einem Item etwas ändert - PropertyChangeEvent - yea! Oldskool!):


```
public void updateContent(PWMGroup group, String password) {

		if (this.currentGroup != null)
			currentGroup.removeListener(internalPropertyChangeListener);

		currentGroupPassword = password;
		currentGroup = group;

		PWMGroup.init(currentGroup);
		currentGroup.addListener(internalPropertyChangeListener);

		// hier passiert es - oder eben nicht...
		contentTableView.setItems(FXCollections
				.<PWMGroupEntry> observableArrayList(group.getEntries()));

		EventHandler.getInstance().fireEvent(group, MainWindow.GROUP_LOADED);
		EventHandler.getInstance().fireEvent(group,
				MainWindow.ENTRY_NOT_SELECTED);
	}
```

Kann mir jemand sagen, was ich hier (gedanklich) falsch mache???

Ach so... Meine TableColumns wurden so initialisiert

```
contentTableView = new TableView<PWMGroupEntry>(
				FXCollections.<PWMGroupEntry> emptyObservableList());
		contentTableView.getSelectionModel().setSelectionMode(
				SelectionMode.SINGLE);
		contentTableView
				.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);
		contentTableView.setMinSize(TableView.USE_PREF_SIZE,
				TableView.USE_PREF_SIZE);

		contentTableView.setOnMouseClicked(new InternalPWMMouseEventHandler(
				Type.CONTENT));
		contentTableView
				.setOnKeyTyped(new InternalKeyEventHandler(Type.CONTENT));

		contentTableView.setContextMenu(ContextMenuCreator.getInstance(
				parentAdapter).getContentMenu(false));

		TableColumn<PWMGroupEntry, String> tcTitle = new TableColumn<PWMGroupEntry, String>(
				"Title");
		tcTitle.setPrefWidth(200);
		tcTitle.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>(
				"name"));
		TableColumn<PWMGroupEntry, String> tcUser = new TableColumn<PWMGroupEntry, String>(
				"Username");
		tcUser.setPrefWidth(200);
		tcUser.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>(
				"username"));
		TableColumn<PWMGroupEntry, String> tcURL = new TableColumn<PWMGroupEntry, String>(
				"URL");
		tcURL.setPrefWidth(250);
		tcURL.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>(
				"url"));
		tcURL.setCellFactory(new Callback<TableColumn<PWMGroupEntry, String>, TableCell<PWMGroupEntry, String>>() {
			@Override
			public TableCell<PWMGroupEntry, String> call(
					TableColumn<PWMGroupEntry, String> param) {
				return new PWMGroupEntryHyperlinkCell(parentAdapter);
			}
		});
		TableColumn<PWMGroupEntry, Calendar> tcDateAdd = new TableColumn<PWMGroupEntry, Calendar>(
				"Date Added");
		tcDateAdd.setPrefWidth(150);
		tcDateAdd
				.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, Calendar>(
						"dateAdded"));
		tcDateAdd
				.setCellFactory(new Callback<TableColumn<PWMGroupEntry, Calendar>, TableCell<PWMGroupEntry, Calendar>>() {
					@Override
					public TableCell<PWMGroupEntry, Calendar> call(
							TableColumn<PWMGroupEntry, Calendar> param) {
						return new PWMGroupEntryDateCell();
					}
				});
		TableColumn<PWMGroupEntry, Calendar> tcDateMod = new TableColumn<PWMGroupEntry, Calendar>(
				"Date Modified");
		tcDateMod.setPrefWidth(150);
		tcDateMod
				.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, Calendar>(
						"dateModified"));
		tcDateMod
				.setCellFactory(new Callback<TableColumn<PWMGroupEntry, Calendar>, TableCell<PWMGroupEntry, Calendar>>() {
					@Override
					public TableCell<PWMGroupEntry, Calendar> call(
							TableColumn<PWMGroupEntry, Calendar> param) {
						return new PWMGroupEntryDateCell();
					}
				});

		contentTableView.getColumns().add(tcTitle);
		contentTableView.getColumns().add(tcUser);
		contentTableView.getColumns().add(tcURL);
		contentTableView.getColumns().add(tcDateAdd);
		contentTableView.getColumns().add(tcDateMod);
```

Ich denke, das Prinzip ist klar...

Daniel


----------



## Paddelpirat (18. Jun 2012)

Wo führst du denn da genau Änderungen an den Properties durch?


----------



## dzim (19. Jun 2012)

PWMGroupEntry ist eine JAXB-ifizierte Klasse, die noch einen PropertyChangeSupport auf sich selbst registriert, add-/removeListener-Methoden mitbringt und dann z.B. den Titel eines Eintrags mittels setter anpasst:


```
public void setName(String name) {
		final String old = this.name;
		this.name = name;
		pcs.firePropertyChange(NAME_CHANGED, old, this.name);
	}
```

also das propertyChange-Event kommt an - darauf reagier ich zwar nicht, weil dann mitunter zu schnell und zu viele Änderungen kommen würden, aber am Ende des Prozessschritts, der das Event auslöst, trigger ich das oben gezeigte Update. Das geht so weit auch - ich habe das per Debugging überprüft. Nur passiert nichts...


----------



## Paddelpirat (19. Jun 2012)

Hmm, schon komisch, weil sonst sieht dein Quellcode ja schon so aus, wie es in der Doku beschrieben wird. Fällt mir momentan nichts zu ein.


----------



## dzim (19. Jun 2012)

Mir auch nicht mehr ;-)

Aber danke dennoch...

BTW: Ich überlege gerade, ob ich das ganze auf github hochlade (auch um es - vielleicht :-D - mal auf der heimischen Windoof-Kiste auszuprobieren) - wenn Interesse besteht... Auch wenn ich befürchte, das ich einen gar fürchterlichen Stil an den Tag gelegt hab, da mir erst mit der Zeit klar wurde, wo ich hin wollte...


----------



## dzim (22. Jun 2012)

Also ich glaub, das Problem ist einfach, dass JavaFX derzeit einfach keine POJOs unterstützt. Mann müsste StringProperty() oder so verwenden und sich strickt an die Vorgaben der JavaFX-Doku halten.

Ich habe dazu ein Ticket geöffnet, nachdem ich auf dem Oracle-Forum auf den entsprechenden Entwickler bei Oracle gestoßen bin:

Login Required - JavaFX

Gegenwärtig scheint die Klasse new PropertyValueFactory nur in der Lage zu sein, die Daten einmal auszulesen, aber kein Databinding/PropertyChangeListener/whatever an die Properties hängen zu können - da kann ich mich Kopf stellen.

Mal sehen, ob sich da noch was tut. Ich will ja nicht immer das Rad neu erfinden müssen (das gilt ja auch für Modell-Klassen!), sondern bereits fertigen Code wiederverwenden können.

Das Databinding in JFX ist an und für sich ja ganz gut - man kann damit offenbar ziemlich coole Sachen machen:
Xtend, JavaFX-Properties and operator overloading | Tomsondev Blog

Aber ich finde die sehr vielen allgemein gehaltenen Generics mitunter recht unübersichtlich...

Nam mal schauen...


----------

