从ArrayList <t> </t>构建JTable

时间:2013-12-11 06:49:21

标签: java swing jtable gson

我想写一个方法,比如public static JTable getJTableFromArrayList(ArrayList list),可以很容易地从ArrayList构建一个JTable来比较各种数据。 此ArrayList应该包含任何类型的Object

我现在能想到的是使用Gson。

  1. 使用Gson.toJsonTree(Object src)方法将ArrayList<T> src解析为JsonElement

  2. JsonObject[]

  3. 构建JsonElement
  4. 使用JsonObject.entrySet()获取Set<Map.Entry<String,JsonElement>>

  5. 然后从自定义的JTable构建AbstractTableModel,而行和列以及标题来自Set

  6. 在开始之前,我想知道是否有一种更简单,更直接的方式来做这件事而不是和Gson一起玩?而且,如果其他人已经完成了这项工作,我很乐意使用现成的工具。

3 个答案:

答案 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;
}

}