private static <ROW_OBJECT> String getRenderedColumnValue(RowObjectTableModel<ROW_OBJECT> model,
			Object columnValue, int columnIndex) {

		TableModel unwrappedModel = RowObjectTableModel.unwrap(model);
		if (!(unwrappedModel instanceof DynamicColumnTableModel)) {
			return null;
		}

		@SuppressWarnings("unchecked")
		DynamicColumnTableModel<ROW_OBJECT> columnBasedModel =
			(DynamicColumnTableModel<ROW_OBJECT>) unwrappedModel;
		GColumnRenderer<Object> renderer = getColumnRenderer(columnBasedModel, columnIndex);
		if (renderer == null) {
			return null;
		}

		ColumnConstraintFilterMode mode = renderer.getColumnConstraintFilterMode();
		if (mode == ColumnConstraintFilterMode.ALLOW_CONSTRAINTS_FILTER_ONLY) {
			// this is a renderer that does not know how to create its own display string
			return null;
		}

		Settings settings = columnBasedModel.getColumnSettings(columnIndex);
		String s = renderer.getFilterString(columnValue, settings);
		return s;
	}
Uses the given row-based table model, row object and column index to determine what the
String value should be for that cell.

<P>This is used to provide a means for filtering on the text that is displayed to the user.

@param <ROW_OBJECT> The model's row object type
@param model the model
@param rowObject the row object for the row being queried
@param column the column index <b>in the table model</b>
@return the string value; null if no value can be fabricated
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/TableUtils.java