【问题标题】:getDataVector gives various data types from TJablegetDataVector 提供来自 TJable 的各种数据类型
【发布时间】:2011-03-25 08:38:47
【问题描述】:

我有一个 JTable,当我使用 jTable1.getModel()).getDataVector() 时,来自不同列的对象具有不同的类型(就我而言,它们应该都是字符串)

我的表格有五列:

  1. 数字(其实是String,但我解析没问题)

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

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

  4. 再次使用组合框字符串,但给了我字符串值,所以没问题

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

如何在单元格中创建组合框(第 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 = ...) 行遇到了同样的异常,但正如你所见,我使用了不同的方式,现在它似乎工作正常。 一开始我以为问题是与单元格中的组合框有关,但它也发生在用户插入简单字符串的列中。

好吧,我可以简单地进行另一个转换,但这让我很困扰,因为没有它它应该可以工作(在不同类型的 JTables 中没有这个问题),这使得代码难以阅读,如果想要扩展这个表有更多的列(可能在不久的将来发生),我将再次为同样的问题而苦苦挣扎。

有谁知道,为什么它会这样工作,是否有任何方法可以强制 jtable(或模型)以统一格式给我单元格的值?

【问题讨论】:

    标签: java swing jtable classcastexception tablemodel


    【解决方案1】:

    与其将List&lt;List&lt;String&gt;&gt; 强制转换为DefaultTableModel,不如将​​AbstractTableModel 扩展为更易于维护,正如Creating a Table Model 中所建议的那样。特别是,您覆盖getColumnClass() 以指定每个基准的精确类型。这具有启用多个默认Editors and Renderers 的直接好处。有一个相关的例子here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多