有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从ArrayList构建java JTable<T>

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

我现在能想到的是使用Gson

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

  2. JsonElement构建JsonObject[]

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

  4. 然后从自定义的AbstractTableModel构建JTable,而行、列和标题则从Set获取

在开始之前,我想知道是否有一种更简单、更直接的方法来实现这一点,而不是使用Gson?而且,如果其他人已经做到了这一点,我会很高兴使用现成的工具


共 (3) 个答案

  1. # 1 楼答案

    我不知道GSON是什么,但我认为你不需要转换数据

    可以使用使用ArrayList保存自定义对象的TableModel

    这个Row Table Model为你做了大部分工作。您只需要实现几个方法(而不是创建一个完整的TableModel)来识别您希望从自定义对象中看到的数据列。JButtonTableModel.java源代码是一个完整的示例,展示了如何实现这一点

    I don't know how to get the field names

    然后,也许你可以使用Bean Table Model为你做所有的工作,并使用反射来创建TableModel

  2. # 2 楼答案

    Use Gson.toJsonTree(Object src) method to parse the ArrayList src into a JsonElement.

    只需将ArrayList<T>调整为TableModel,而不是将列表转换为Gson

    Use JsonObject.entrySet() to get a Set<Map.Entry<String,JsonElement>>

    ATableModel需要按可预测的顺序访问它的元素,因为它可以通过行索引访问它们。因此,必须找到一种方法,将行索引映射到集合的元素。但是如果你只是将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;
    }
    
    }
    
  3. # 3 楼答案

    如图所示here,让TableModel包含Map并使用keySet()索引getValueAt()实现中的行