Чтобы облегчить создание TableView со столбцами в приложении JavaFX, я подумал о создании аннотации для указания поля в класс модели, который я хотел бы создать TableColumn со значением типа ячейки, связанным с ним. Вот аннотацию я писал:JavaFx Использование отражения с пользовательской аннотацией для создания TableColumn: невозможно создать экземпляр класса с параметром
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AsTableColumn {
String text();
int index();
}
А класс Person образец модели, как это:
public class Person {
@AsTableColumn(text="Name", index=0)
private String name;
@AsTableColumn(text="Age", index=0)
private int age;
// setters and getters
}
В родном пути создания TableView с колоннами в JavaFX, я должен писать код, как это :
TableView<Person> table = new TableView<>();
TableColumn<Person, String> nameCol = new TableColumn<Person, String>("Name");
TableColumn<Person, Integer> ageCol = new TableColumn<Person, Integer>("Age");
nameCol.setCellValueFactory(cellData -> new SimpleObjectProperty<String>(cellData.getValue().getName()));
ageCol.setCellValueFactory(cellData -> new SimpleObjectProperty<Integer>(cellData.getValue().getAge()));
у меня есть несколько таблиц с большим количеством столбцов, так что это раздражает писать много кода, как это который я думаю, там должен быть способ, чтобы упростить его.
Когда я написал обработчик аннотации, я столкнулся с проблемой создания экземпляра TableColumn<T,S>
, где T параметрируется в сигнатуре метода, но S динамически обнаруживается во время выполнения.
import java.lang.reflect.Field;
import javafx.scene.control.TableColumn;
public class AnnotationProcessor {
/**
* Process the model class.
*
* For the fields declared which have annotation AsTableColumn, create a TableColumn<T,S>
* instance for it with the detected field type.
* @param clas
*/
public static <T> List<TableColumn<T, ? extends Object>> process(Class<T> clas) {
for(Field field : clas.getDeclaredFields()) {
if(field.isAnnotationPresent(AsTableColumn.class)) {
AsTableColumn anno = field.getAnnotation(AsTableColumn.class);
Class<?> type = field.getType();
TableColumn<T, /* how to specify the field type here???*/> col = new TableColumn<>();
}
}
}
}
Дженерики просто обеспечивают безопасность во время компиляции и не работают во время выполнения. –
Я бы указал тип поля, используя тип класса –
@SvenOlderaan. Но проблема заключается в создании экземпляра универсального класса во время выполнения, не получая его общий тип генерации – qingl97