getDataVector提供来自TJable的各种数据类型

时间:2011-03-24 20:52:31

标签: java swing jtable classcastexception tablemodel

我有一个JTable,当我使用jTable1.getModel()时。来自不同列的getDataVector()对象有不同的类型(对于我的情况,它们应该是所有字符串)

我的表有五列:

  1. 数字(实际上是字符串,但我解析它没问题)

  2. 从附加到单元格的组合框中选择的字符串,但是当我想从中获取值时,它似乎是Vector,而不是字符串

  3. 再次编号(如0列 - 这里没问题)

  4. 再次使用combobox进行String,但给出了String值,所以没问题

  5. 数字(隐藏在字符串中)但是这应该是字符串,但是是Vector

  6. 我如何在单元格中创建组合框(第1列和第3列):

        TableColumn column = jTable1.getColumnModel().getColumn(3);
        JComboBox cb = new JComboBox(ServerIntf.DataModificationType.getStringList().toArray());
        column.setCellEditor(new DefaultCellEditor(cb));
    

    我如何创建表模型:

       public TableModel getTableModel() {
        Vector<Vector<String>> data = task.getDataSet(dataName);
        ServerIntf.SimpleDataType sdt = Manager.manager.getSimpleDataType(task, dataName);
        rowsMin = sdt.getRowMin();
        rowsMax = sdt.getRowMax();
        columnsMin = sdt.getColMin();
        columnsMax = sdt.getColMax();
        if (data != null) {
            //nothing important here, it doeasn't come into this part anyway
        }
        int cmax = 5;
        int rmax = 1;
        Vector columns = new Vector(cmax);
        columns.addAll(Arrays.asList(new String[]{"ID", "Przekształcenie", "Ile razy", "Co z danymi", "Co dalej"}));
    
        return new DefaultTableModel(columns, rmax);
    }
    

    这就是我读数据的方式:

      public AlgorythmTable(List get) {
        steps = new Vector<Step>();
        for (List<String> row : (List<List<String>>) get) {
            steps.add(new Step(row));
        }
        //boring here
    }
      //...
        public Step(List list) {
            id = Integer.parseInt((String) list.get(0));
            matrix = ((String) ((Vector) list.get(1)).get(0)).isEmpty() ? null : ((String) ((Vector) list.get(1)).get(0));
            count = ((String) list.get(2))==null || ((String) list.get(2)).isEmpty() ? 0 : Integer.parseInt((String) list.get(2));
            after = ((String) list.get(3)).isEmpty() ? null : ServerIntf.DataModificationType.getByName((String) list.get(3));
            nextStep = ((String) list.get(4))==null || ((String) list.get(4)).isEmpty() ? -1 : Integer.parseInt(((String) list.get(1)));
        }
    

    我在最后一行得到CastException(nextStep = ...)

      Exception occurred during event dispatching:
      java.lang.ClassCastException: java.util.Vector cannot be cast to java.lang.String
    

    我在行(matrix = ...)上得到了相同的异常,但正如你所看到的那样,我以不同的方式进行了渲染,现在看起来效果很好。 我一开始认为问题与单元格中的组合框有关,但它也出现在用户插入简单字符串的列中。

    嗯,我可以简单地做另一个演员,但它困扰我,因为它应该没有它工作(在不同种类的JTable中没有这个问题),这使代码难以阅读,如果将要扩展此表有更多的列(可能会在不久的将来发生),我将再次遇到同样的问题。

    有没有人有任何想法,为什么它会这样工作?如果有任何方法迫使jtable(或模型)给我统一格式的单元格值?

1 个答案:

答案 0 :(得分:1)

而不是强迫List<List<String>>加入DefaultTableModel,如Creating a Table Model中所述,扩展AbstractTableModel可能更容易维护。特别是,您重写getColumnClass()以指定每个数据的精确类型。这具有启用多个默认Editors and Renderers的直接好处。有一个相关的例子here