我想写一个方法,比如public static JTable getJTableFromArrayList(ArrayList list)
,可以很容易地从ArrayList构建一个JTable来比较各种数据。 此ArrayList应该包含任何类型的Object 。
我现在能想到的是使用Gson。
使用Gson.toJsonTree(Object src)
方法将ArrayList<T> src
解析为JsonElement
。
从JsonObject[]
JsonElement
使用JsonObject.entrySet()
获取Set<Map.Entry<String,JsonElement>>
然后从自定义的JTable
构建AbstractTableModel
,而行和列以及标题来自Set
。
在开始之前,我想知道是否有一种更简单,更直接的方式来做这件事而不是和Gson一起玩?而且,如果其他人已经完成了这项工作,我很乐意使用现成的工具。
答案 0 :(得分:2)
如图所示here,让您的TableModel
包含 Map
并使用keySet()
为getValueAt()
实施中的行编制索引1}}。
答案 1 :(得分:2)
不知道GSON是什么,但我认为您不需要转换数据。
您可以使用使用ArrayList的TableModel来保存自定义对象。
Row Table Model为您完成大部分工作。您只需要实现几个方法(而不是创建整个TableModel)来标识要从自定义对象中查看的数据列。 JButtonTableModel.java
源代码是一个完整的示例,说明了如何执行此操作。
我不知道如何获取字段名称
然后也许您可以使用Bean Table Model为您完成所有工作,并使用反射来创建TableModel。
答案 2 :(得分:1)
使用Gson.toJsonTree(Object src)方法将ArrayList src解析为JsonElement。
只需将ArrayList<T>
调整为TableModel
,而不是将列表转换为Gson。
使用JsonObject.entrySet()获取
Set<Map.Entry<String,JsonElement>>
TableModel
需要以可预测的顺序排列元素,因为它可以通过行索引访问它们。因此,您必须找到一种方法如何将行索引映射到集合的元素。但是,如果您只是将ArrayList
调整为TableModel
,这也不会有问题。
您似乎在寻找TableCellRenderer
,因为您说要像Gson创建元素树一样显示任意对象。所以我会这样实现它:
class JsonTableCellRenderer extends DefaultTableCellRenderer {
private String[] propertyColumns;
private Gson gson;
public JsonTableCellRenderer(String... propertyColumns) {
this.propertyColumns = propertyColumns;
gson = new Gson();
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JsonElement element = gson.toJsonTree(value);
if (element instanceof JsonObject) {
JsonObject jsonObject = (JsonObject) element;
String propertyName = propertyColumns[column];
JsonElement propertyElement = jsonObject.get(propertyName);
String propetyValue = propertyElement.toString();
return super.getTableCellRendererComponent(table, propetyValue, isSelected, hasFocus, row, column);
}
// implement this behavior, e.g throw exception
return null;
}
}