JavaFX Nutzen von Interface Callback<P,R>

GhostfaceChilla

Bekanntes Mitglied
Hallo Leute. Da ich mich zur Zeit mit DI und allgemein JavaFx sehr viel beschäftige, bin auch das Interface Callback gestoßen. Ich verstehe was in der Dokumentation steht (Callback (JavaFX 2.2)), aber ich weis nicht was mir diese Interface nutzen kann. Ich habe gesehen das es in JavFX vorallem für Factories benutz wird ( FXMLLoader .setControllerFactory() oder .setCellFactory() etc.) Wie funktioniert dieses Interface und wie kann es dazu eingesetzt werden um solch eine Fcatory zu erstellen?
Vielen Dank für eure Hilfe schonmal, ich bin durch das Internet nicht wirklich schlauer geworden 😳

-GhostfaceChilla-
 
Wie der Name Callback eventuell vermuten lässt, wird es u.a. von den von dir genannten Factories dann aufgerufen, wenn zum Beispiel eine Zeile einer Liste oder Tabelle dargestellt werden muss. Dies geschieht On-Demand - will heissen: Es werden nicht schon beim Laden der Daten alle UI-Elemente bis zum letzten Tabelleneintrag erstellt, sondern erst, wenn sie angezeigt werden müssen (z.B. wenn man Scrollt).
Angewendet werden sie meist einfach, indem man sie implementiert. Bestes Bsp. bleiben die cellFactories.

Bsp. 1:
Java:
Callback<TableColumn.CellDataFeatures<TestDetails, TestDetails>, ObservableValue<TestDetails>> contentCallback = new Callback<TableColumn.CellDataFeatures<TestDetails, TestDetails>, ObservableValue<TestDetails>>() {
	@Override
	public ObservableValue<TestDetails> call(CellDataFeatures<TestDetails, TestDetails> param) {
		return new SimpleObjectProperty<TestDetails>(param.getValue());
	}
};
Gibt ein TestDetail-Objekt (einfache Bean, keine JavaFX-Observables!), wenn es benötigt wird... Das heiss, wenn es angezeigt werden soll:
Bsp. 2:
Java:
tableColumnId.setCellFactory(new Callback<TableColumn<TestDetails, TestDetails>, TableCell<TestDetails, TestDetails>>() {
	@Override
	public TableCell<TestDetails, TestDetails> call(TableColumn<TestDetails, TestDetails> param) {
		return new ResultDetailsTableCell(TestDetails.TEST_SERIESID);
	}
});
Und die Klasse ResultDetailsTableCell:
Java:
public class ResultDetailsTableCell extends TableCell<TestDetails, TestDetails> {
		
	private final String type;
		
	public ResultDetailsTableCell(final String type) {
		this.type = type;
	}
		
	@Override
	protected void updateItem(TestDetails item, boolean empty) {
		
		super.updateItem(item, empty);
		
		if (empty) {
			setText(null);
		} else {
			setTextOverrun(OverrunStyle.ELLIPSIS);
			String text = "";
			if (TestDetails.TEST_SERIESID.equals(type) || TestDetails.TEST_TESTID.equals(type)) {
				text = StringResource.getString("root.table.column.seriesTest.format", item.getFormatedStringByKey(TestDetails.TEST_SERIESID),
						item.getFormatedStringByKey(TestDetails.TEST_TESTID));
			} else if (TestDetails.TEST_TIMESTAMP.equals(type)) {
				DateFormat df = new SimpleDateFormat(StringResource.getString("root.table.column.date.format"), Locale.ENGLISH);
				text = df.format(new Date(item.getLong(TestDetails.TEST_TIMESTAMP)));
			} else if (TestDetails.DOWNLOAD_AVERAGE.equals(type)) {
				text = item.getFormatedStringByKey(TestDetails.DOWNLOAD_AVERAGE);
			} else if (TestDetails.UPLOAD_AVERAGE.equals(type)) {
				text = item.getFormatedStringByKey(TestDetails.UPLOAD_AVERAGE);
			} else if (TestDetails.RTT_AVERAGE.equals(type)) {
				text = item.getFormatedStringByKey(TestDetails.RTT_AVERAGE);
			}
			setText(text);
		}
	}
}
 
Zuletzt bearbeitet:

Zurück
Oben