Nicht funktionierendes Databinding an POJOs für TableView

Rudolf

Bekanntes Mitglied
Hi,

ich habe im Internet eine Quelle gefunden, die behauptet, dass Databinding an POJOs für das TableView nicht funktioniert. Ich konnte mir nicht vorstellen, dass Oracle solche unfertigen Frameworks auf die Masse loslässt. Ist ja mehr als peinlich, wenn das stimmen sollte.

Ich habe folgende Beanklasse.

Java:
public class Bean {

	private final SimpleStringProperty datum = new SimpleStringProperty();
	private final SimpleStringProperty von = new SimpleStringProperty();
	private final SimpleStringProperty bis = new SimpleStringProperty();
	private final SimpleStringProperty über = new SimpleStringProperty();

	public String getDatum() {
		return datum.get();
	}

	public void setDatum(String datum) {
		this.datum.set(datum);
	}

	public String getVon() {
		return von.get();
	}

	public void setVon(String von) {
		this.von.set(von);
	}

	public String getBis() {
		return bis.get();
	}

	public void setBis(String bis) {
		this.bis.set(bis);
	}

	public String getÜber() {
		return über.get();
	}

	public void setÜber(String über) {
		this.über.set(über);
	}
}

Und folgenden Controller

Java:
public class MainController implements Initializable {

	@FXML //  fx:id="tabelle"
	private TableView<Bean> tabelle; // Value injected by FXMLLoader
	@FXML //  fx:id="datumCol"
	private TableColumn<Bean, String> datumCol; // Value injected by FXMLLoader
	@FXML //  fx:id="vonCol"
	private TableColumn<Bean, String> vonCol; // Value injected by FXMLLoader
	@FXML //  fx:id="bisCol"
	private TableColumn<Bean, String> bisCol; // Value injected by FXMLLoader
	@FXML //  fx:id="überCol"
	private TableColumn<Bean, String> überCol; // Value injected by FXMLLoader
	@FXML //  fx:id="ende"
	private Button ende; // Value injected by FXMLLoader

	// Handler for Button[fx:id="ende"] onAction
	public void ende(ActionEvent event) {
		Bean selectedItem = tabelle.getSelectionModel().getSelectedItem();
		if (selectedItem != null) {
			selectedItem.setBis(rangeDate(new Date()));
		}
	}

	private String rangeDate(Date date) {
		return new SimpleDateFormat("HH:mm:ss").format(date).toString();
	}

	@Override // This method is called by the FXMLLoader when initialization is complete
	public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
		// initialize your logic here: all @FXML variables will have been injected
		datumCol.setCellValueFactory(new PropertyValueFactory<Bean, String>("datum"));
		vonCol.setCellValueFactory(new PropertyValueFactory<Bean, String>("von"));
		bisCol.setCellValueFactory(new PropertyValueFactory<Bean, String>("bis"));
		überCol.setCellValueFactory(new PropertyValueFactory<Bean, String>("über"));
	}
}

Das Problem ist, dass beim

Java:
selectedItem.setBis(rangeDate(new Date()));

die tabelle nicht aktualisiert wird. Die Daten werden gesetzt. Das sieht man aber erst, wenn eine neue Row hinzugefügt.

Also gibts wirklich keine Möglichkeit die Bean soweit zu konfigurieren, oder die tablleView, dass bei Änderungen in der Bean die tabelle automatisch aktualisiert wird. In swing hatte man zumindest fireTableEvent().
 
Merkwürdig,

hatte nur
Java:
public SimpleStringProperty bisProperty() {
     return bis;
}

damit funktionierte es natürlich nicht. Aber mit

Java:
public StringProperty bisProperty() {
     return bis;
}

gehts, DANKE!
 

Zurück
Oben