Voici un exemple de solution utilisant la réflexion et les annotations.
public class Worker {
@Updatable(false)
@Order(1)
@ColumnName("ID")
private int id;
@Updatable(true)
@Order(2)
@ColumnName("FIRST NAME")
private String firstName;
@Updatable(true)
@Order(3)
@ColumnName("LAST NAME")
private String lastName;
public Worker() {
}
public Worker(int id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
@Order(1)
public int getId() {
return id;
}
@Order(1)
public void setId(int id) {
this.id = id;
}
@Order(2)
public String getFirstName() {
return firstName;
}
@Order(2)
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Order(3)
public String getLastName() {
return lastName;
}
@Order(3)
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
-
@Retention(RetentionPolicy.RUNTIME)
public @interface Order {
int value();
}
-
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ColumnName {
String value();
}
-
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Updatable {
boolean value();
}
-
public class ComparatorReflection<T extends AccessibleObject & Member> implements Comparator<T>{
@Override
public int compare(T o1, T o2) {
Order or1 = o1.getAnnotation(Order.class);
Order or2 = o2.getAnnotation(Order.class);
if (or1 != null && or2 != null && or1.value() - or2.value() != 0) {
return or1.value() - or2.value();
}
return o1.getName().compareTo(o2.getName());
}
}
-
public class ModelDAO extends AbstractTableModel {
private List<?> data;
public ModelDAO(List data) {
this.data = data;
}
@Override
public int getRowCount() {
return this.data.size();
}
@Override
public int getColumnCount() {
return data.get(0).getClass().getDeclaredFields().length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
try {
Method[] methods = data.get(rowIndex).getClass().getDeclaredMethods();
Arrays.sort(methods, new ComparatorReflection<Method>());
return methods[2*columnIndex].invoke(data.get(rowIndex), null);
} catch (Exception ex) {
ex.printStackTrace();
}
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Class<?> getColumnClass(int columnIndex) {
Field[] fields = data.get(0).getClass().getDeclaredFields();
Arrays.sort(fields, new ComparatorReflection<Field>());
return fields[columnIndex].getType();
}
@Override
public String getColumnName(int column) {
Field[] fields = data.get(0).getClass().getDeclaredFields();
Arrays.sort(fields, new ComparatorReflection<Field>());
return fields[column].getAnnotation(ColumnName.class).value();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
Field[] fields = data.get(rowIndex).getClass().getDeclaredFields();
Arrays.sort(fields, new ComparatorReflection<Field>());
return fields[columnIndex].getAnnotation(Updatable.class).value();
}
}
Voulez-vous dire que vous voulez stocker différents POJO est dans un JTable? – Kayaman
Non, mais je veux avoir par exemple un JTable générique pour chaque POJO donc je n'aurai pas besoin de créer une classe pour chacun d'entre eux. – ardayigit
Pour être honnête, il vaut mieux écrire cinq classes qui étendent AbstractTableModel. Il suffit de remplacer quatre ou cinq méthodes dans chacune d'elles, et elles ne sont pas très longues. – VGR