- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些需要在 JTable 中显示的对象(航站楼、跑道、登机口、航空公司、工作人员等...)。我正在尝试构建一个适用于每个集合的 GenericTableModel (与 JTable 一起使用)。问题是其中一些对象具有数据结构,我不想显示这些结构。因此,我通过从集合中获取第一个对象并询问其声明的字段来获取列名称,这些字段不可从 AbstractMap 或 Collection 类分配。这似乎对我有用,到目前为止我只得到了我需要的字段。当我试图向 worker 展示时,问题就开始了。我有一个 W_Worker 抽象类,其中包含工作人员的大部分字段,并且我有不同的工作人员,例如 W_Manager、W_FuelWorker 等...每个子类只有 1 或 2 个字段,当我使用 GenericTableModel 将它们放入表中时,我仅从特定工作人员获取字段,而没有从 W_Worker 获取字段。
如何在方法的开头确定该类是否扩展了另一个类并使其首先获取这些字段?
如果这还不足以理解,我将提供代码。提前致谢,塔尔
编辑:添加代码。
public String[] getColumnName(Collection<T> collection){
Field fields[] = null;
String fieldsNames[];
ArrayList<String> desiredFields = new ArrayList<>();
for(Object o : collection){
fields = o.getClass().getDeclaredFields();
if (o instanceof W_Worker){
Field[] superFields = o.getClass().getSuperclass().getDeclaredFields();
Field[] result = new Field[superFields.length + fields.length];
System.arraycopy(superFields, 0, result, 0, superFields.length);
System.arraycopy(fields, 0, result, superFields.length, fields.length);
fields = result;
}
break;
}
fieldsNames = new String[fields.length];
for(int i = 0; i<fields.length ;i++){
if (!Collection.class.isAssignableFrom(fields[i].getType()) && !AbstractMap.class.isAssignableFrom(fields[i].getType())){
fieldsNames[i] = fields[i].getName();
}
}
for(String field : fieldsNames){
if (field != null){
desiredFields.add(field);
}
}
String newFields[] = new String[desiredFields.size()];
return desiredFields.toArray(newFields);
}
如您所见,我当前正在使用 instanceof,但这不够通用,因为它只能与 W_Worker 一起使用。
最佳答案
我会考虑 Visitor Pattern为了这。访问者会知道如何处理 TableModel。
有点像这样:
public class TableModelVisitor {
private TableModel model;
public void visit(Terminal terminal) {
terminal.accept(this);
}
public void visit(Runway runway) {
runway.accept(this);
}
public void visit(Worker worker) {
worker.accept(this);
}
//your methods to treat the model
}
然后您可以让每个节点与访问者打交道并要求它执行诸如填充模型之类的操作:
public class Worker {
public void accept(TableModelVisitor tableModelVisitor) {
//and here you know everything about your worker and its fields
//and have access to your visitor table model to configure it.
tableModelVistor.addField(this.getMyField1());
tableModelVistor.addField(this.getMyField2());
}
}
最后,您所要做的就是创建一个 TableModelVisitor 并要求它填充您想要的任何模型。
TableModelVisitor visitor = new TableModelVisitor(myTableModel);
visitor.visit(anyOfMyObjects);
关于Java泛型编程: Determining if class extends another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18319656/
我是一名优秀的程序员,十分优秀!