Java Swing JTable 高级用法

1、解决JTable 显示问题
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

猜你喜欢

转载自hrdsalon.iteye.com/blog/2232857