2、更方便的更新JTable 内容
3、希望更了解,Swing 内核机制的 请给与补充。
赞为解决问题:需要通知调用TableModelEvent 实现实时刷新
需要用到 一个自定义Annotation
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Target({ElementType.FIELD,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface TableAnnotation { String name(); boolean isedit() default false; int width() default 0; }
主要用于直接获取 需要转换对象 显示的 列名称
实现TableModel 接口
class Model<E> implements TableModel{ private List<E> values; private Class<?> clazz; private List<TableAnnotation> ants = new ArrayList<TableAnnotation>(); private List<Class<?>> clazzs = new ArrayList<Class<?>>(); private List<Field> fields = new ArrayList<Field>(); //构造方法将需要,用于显示的List传入,解析需要具体显示的行及其他信息 public Model(List<E> values,Class<?> clazz){ this.values = values; this.clazz = clazz; Field[] fieldss = clazz.getFields(); for(int i=0;i<fieldss.length;i++){ Field f = fieldss[i]; TableAnnotation ant = f.getAnnotation(TableAnnotation.class); if(ant != null){ fields.add(f); this.ants.add(ant); clazzs.add(f.getDeclaringClass()); } } } @Override public int getRowCount() { return values.size(); } @Override public int getColumnCount() { return ants.size(); } @Override public String getColumnName(int columnIndex) { return ants.get(columnIndex).name(); } @Override public Class<?> getColumnClass(int columnIndex) { return clazzs.get(columnIndex); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } @Override public Object getValueAt(int rowIndex, int columnIndex) { try { return fields.get(columnIndex).get(values.get(rowIndex)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { } @Override public void addTableModelListener(TableModelListener l) { } @Override public void removeTableModelListener(TableModelListener l) { } }
直接创建JTalbe,使用以上Model即可动态改变JTalbe