JAVA从抽象集合的ArrayList生成swt.table
你好 我的情况如下: 我有一些数据库实体类(JAVA从抽象集合的ArrayList生成swt.table,java,arraylist,Java,Arraylist,你好 我的情况如下: 我有一些数据库实体类(Auto,Driver,Bill,等等)及其字段。我可以从我的数据库中获取它们的ArrayList-ArrayList,ArrayList,等等 现在,我希望能够从我拥有的任何集合生成swt表。 所以,在我的梦中,它就像是所有类集合的一个通用方法 public class TableGenerator{ public Table generate(Shell shell, ArrayList<? extends IDBEntity>
Auto
,Driver
,Bill
,等等)及其字段。我可以从我的数据库中获取它们的ArrayList-ArrayList
,ArrayList
,等等
现在,我希望能够从我拥有的任何集合生成swt表。
所以,在我的梦中,它就像是所有类集合的一个通用方法
public class TableGenerator{
public Table generate(Shell shell, ArrayList<? extends IDBEntity> instance){
//swt.table creation
//passing data into this table
}
}
公共类表格生成器{
公共表生成(Shell,ArrayList)实现这一点的一种方法是使用访问者模式
创建一个Visitor
界面:
public interface DBEntityVisitor {
void visit(Auto pAuto);
void visit(Driver pDriver);
void visit(Bill pBill);
}
转到IDBEntity
界面并添加方法:
void accept(DBEntityVisitor pDBEntityVisitor);
现在转到具体的类Auto
、Bill
和Driver
,并实现accept
方法:
@Override
public void accept(DBEntityVisitor pDBEntityVisitor) {
pDBEntityVisitor.visit(this);
}
在表格生成器中
:
public Table generate(Shell shell, ArrayList<IDBEntity> instance){
DBEntityVisitor lVisitor = new DBEntityVisitor() {
@Override
public void visit(Auto pAuto) {
System.out.println("I am a car");
}
@Override
public void visit(Driver pDriver) {
System.out.println("I am a driver");
}
@Override
public void visit(Bill pBill) {
System.out.println("I am a bill");
}
};
for(IDBEntity lInstance : instance){
lInstance.accept(lVisitor);
}
}
生成公共表(Shell、ArrayList实例){
DBEntityVisitor lVisitor=新的DBEntityVisitor(){
@凌驾
公众无效访问(自动pAuto){
System.out.println(“我是一辆车”);
}
@凌驾
公众无效访问(驾驶员pDriver){
System.out.println(“我是司机”);
}
@凌驾
公众无效访问(Bill pBill){
System.out.println(“我是一张账单”);
}
};
for(IDB实体实例:实例){
lInstance.accept(lVisitor);
}
}
如果您希望它非常动态,您可以通过将数组设置为JSON数组和对象设置为JSON对象来使用所提供的内省
Gson gson = new Gson();
List<IDBEntity> l = new ArrayList<>();
l.add(new Auto());
l.add(new Driver());
l.add(new Bill());
String json = gson.toJson(l);
// Just to view if data is alright.
System.out.println(json)
JsonArray a = new JsonParser().parse(json).getAsJsonArray();
// Iterate array
for (JsonElement o: a) {
// Iterate fields and values of each object
for (Map.Entry<String, JsonElement> e: ((JsonObject) o).entrySet()) {
System.out.println(e.getKey());
System.out.println(e.getValue());
}
}
Gson-Gson=new-Gson();
列表l=新的ArrayList();
l、 添加(新的Auto());
l、 添加(新驱动程序());
l、 增加(新法案());
字符串json=gson.toJson(l);
//只是为了查看数据是否正常。
System.out.println(json)
JsonArray a=new-JsonParser().parse(json.getAsJsonArray();
//迭代数组
对于(JsonElement o:a){
//迭代每个对象的字段和值
对于(Map.Entry e:((JsonObject)o.entrySet()){
System.out.println(e.getKey());
System.out.println(e.getValue());
}
}
现在检查对象数组,检查其属性以添加列,然后运行每个对象并将其属性值添加到列中。是否希望IDBEntity
的任何子类的字段在表中显示为列?哇,太好了,我将尝试在使用的每个循环中接受它,因为认为ArrayList包含不同的DbEntity?是的,我认为它包含实现IDBEntity的不同对象。然而,如果列表仅包含Auto的,则Auto的visit方法将被执行n次。我还需要为表生成标头。因此,我认为我应该拒绝使用此循环并调用一次“accept”方法。无论如何,你的代码太棒了,我应该再次感谢你:)是的,我知道这就是我的解决方案的原因。您可以在每个具体类的visitor方法中添加单独的内容。从我的观点来看,不必使用json并添加json库。哇,谢谢。我从未在java中使用json,所以我需要一点时间来实现您的建议:)拥有json版本总是很好的根据手头的数据,我想:-)是的,一点也不争论,但在我的场合,时间就是金钱:)有时花时间,节省你以后的时间。