getDataVector предоставляет различные типы данных из TJable - PullRequest
1 голос
/ 24 марта 2011

У меня есть JTable, и когда я использую jTable1.getModel ()). GetDataVector () объекты из разных столбцов имеют разные типы (они должны быть всеми строками для моего случая)

В моей таблице пять столбцов:

  1. число (на самом деле это строка, но у меня нет проблем с ее разбором)

  2. Строка, выбранная из выпадающего списка, присоединенного к ячейке, но когда яхочу получить из него значение, которое представляется Vector, а не String

  3. снова число (как в 0 столбце - здесь нет проблем)

  4. снова String с выпадающим списком, но дает мне строковое значение, так что нет проблем

  5. число (скрыто в String), но опять же это должно быть String, но это Vector

как я создаю комбинированные списки в ячейках (столбцы 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

Я получаю то же исключениеn в строке (matrix = ...), но, как вы можете видеть, я произнес это по-другому, и теперь он, кажется, работает нормально.Сначала я подумал, что проблема связана с выпадающими списками в ячейках, но это также происходит в столбце, где пользователь вставляет простую строку.

Что ж, я могу просто выполнить другое приведение, но это беспокоит меня, потому чтоон должен работать без него (такой проблемы не было в разных типах JTables), это делает код трудным для чтения, и если когда-нибудь захочется расширить эту таблицу большим количеством столбцов (что может произойти в ближайшем будущем), и я снова буду боротьсяс той же проблемой.

Кто-нибудь имеет какие-либо идеи, почему это работает так, и если есть какой-либо способ заставить jtable (или модель) дать мне значения ячеек в унифицированном формате?

1 Ответ

1 голос
/ 25 марта 2011

Вместо принуждения List<List<String>> в DefaultTableModel может быть более целесообразно расширить AbstractTableModel, как это предлагается в Создание модели таблицы .В частности, вы переопределяете getColumnClass(), чтобы указать точный тип каждого элемента данных.Это имеет прямое преимущество, позволяя включить несколько стандартных редакторов и средств визуализации .Вот соответствующий пример здесь .

...