@Override
	public final Object getColumnValueForRow(ROW_TYPE t, int columnIndex) {
		if (columnIndex < 0 || columnIndex >= tableColumns.size()) {
			return null;
		}

		DATA_SOURCE dataSource = getDataSource();

		@SuppressWarnings("unchecked")
		// TODO: We are casting now, as in practice the type should never be different that
		//       the declared type.  We want to remove entirely the 'dataSource' value and then
		//       the templating will be simpler.
		DynamicTableColumn<ROW_TYPE, ?, DATA_SOURCE> column =
			(DynamicTableColumn<ROW_TYPE, ?, DATA_SOURCE>) tableColumns.get(columnIndex);

		if (t == null) {
			// sometimes happen if we are painting while being disposed
			return null;
		}

		return column.getValue(t, columnSettings.get(column), dataSource, serviceProvider);
	}
Returns true if the column indicated by the index in the model is a default column (meaning
that it was specified by the model and not discovered).

@param modelIndex the index of the column in the model.
@return true if the column is a default.
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GDynamicColumnTableModel.java