По совпадению я делал то же самое сегодня.Я придумал следующее решение.Я не думаю, что это лучше, и к настоящему времени это все еще не очень хорошо спроектировано.Но это может сработать.
Вы можете использовать Reflection для определения полей вашего класса и добавить tableColumn следующим образом:
Field[] fields = Player.class.getDeclaredFields();
for (Field f : fields)
{
TableColumn<DatabaseItem, Object> tblColumn = new TableColumn<>(f.getName());
tblColumn.setCellValueFactory(new PropertyValueFactory<Player, Object>(f.getName()));
tblView.getColumns().add(tblColumn);
}
Теперь вы можете расширить это, используя пользовательские аннотации для видимости,Имя и приоритет заголовка:
@Retention(RUNTIME)
@Target(FIELD)
public @interface DynTableColumn
{
boolean visible() default false;
String header() default "N/V";
int prio() default Integer.MAX_VALUE;
}
Игрок:
public class Player
{
@DynTableColumn(visible = true, header = "First Name", prio = 10)
private String firstName;
@DynTableColumn(visible = true, header = "Last Name", prio = 20)
private String lastName;
@DynTableColumn(visible = true, header = "Age", prio = 30)
private int age;
[..]
}
И измените код выше:
private void setTableColumns()
{
Field[] fields = item.getClass().getDeclaredFields();
List<TableColumn<DatabaseItem, Object>> columns = new ArrayList<>();
for (Field f : prepareField(fields))
{
DynTableColumn annotation = f.getAnnotation(DynTableColumn.class);
TableColumn<DatabaseItem, Object> tblColumn = new TableColumn<>(annotation.header());
tblColumn.setCellValueFactory(new PropertyValueFactory<DatabaseItem, Object>(f.getName()));
columns.add(tblColumn);
}
tblView.getColumns().addAll(columns);
}
private Field[] prepareField(Field[] fieldToPrepare)
{
return sortFieldByAnnotation(filterFieldByAnnotatedFields(fieldToPrepare));
}
public Field[] sortFieldByAnnotation(Field[] fieldsToSort)
{
class sortByAnnotationPrio implements Comparator<Field>
{
@Override
public int compare(Field o1, Field o2)
{
DynTableColumn a1 = o1.getAnnotation(DynTableColumn.class);
DynTableColumn a2 = o2.getAnnotation(DynTableColumn.class);
return a1.prio() - a2.prio();
}
}
Arrays.sort(fieldsToSort, new sortByAnnotationPrio());
return fieldsToSort;
}
public Field[] filterFieldByAnnotatedFields(Field[] fieldsToFilter)
{
Field[] filteredFields = new Field[fieldsToFilter.length];
int i = 0;
for (Field f : fieldsToFilter)
{
if (f.isAnnotationPresent(DynTableColumn.class))
{
filteredFields[i] = f;
i++;
}
}
return removeNullValues(filteredFields);
}
private Field[] removeNullValues(Field[] fieldsToFilter)
{
List<Field> list = new ArrayList<Field>();
for (Field f : fieldsToFilter)
{
if (f != null)
{
list.add(f);
}
}
return list.toArray(new Field[list.size()]);
}