Добавить/удалить дополнительные столбцы в JTable из пользовательской модели AbstractTableModel

У меня есть вектор с элементами HashMap. Я хочу поместить его в таблицу, и каждое значение HashTable должно быть в столбце с заголовком столбца ключа HashTable. Таким образом, элементы с ключом "key1" должны появиться в столбце таблицы с именем "key1".

Проблема, когда я пытаюсь добавить/удалить столбцы таблицы с помощью функции setHash(). Я передаю String[] с большим/меньшим количеством элементов, и когда эта функция запускает fireTableStructureChanged() java-броски, как сумасшедшие.

Я не понимаю, где проблема. Не могли бы вы мне помочь?

Реализация табличной модели находится здесь:

public class ResizableTableModel extends AbstractTableModel {
  protected DataSource src;
  protected String[] hash;

  //......................

  public void setHash(String[] hash) {
        this.hash = hash;
        fireTableStructureChanged();  // THROWS!
  }

  public ArrayList getData() { return src.getData(); }
  public int getColumnCount() { return hash.length; }
  public int getRowCount() { return getData() == null ? 0 : getData().size(); }
  public String getColumnName(int col) { return hash[col]; }
  public boolean isCellEditable(int row, int col) { return true; }
  public Object getValueAt(int row, int col) {
    try {
      return ((HashMap) getData().get(row)).get(hash[col]);
    } catch (Exception e) {
      return null;
    }
  }
  public void setValueAt(Object obj, int row, int col) {
    try {
      //...................
    } catch (Exception e) {}
    fireTableDataChanged();
  }
}

person Chameleon    schedule 10.04.2013    source источник
comment
В HashMap отсутствует индексация, вместо этого нужно использовать список   -  person mKorbel    schedule 10.04.2013
comment
Я не понимаю, в чем проблема. И кому-либо будет трудно выяснить, в чем проблема, поскольку ваш код неполный, и вы не сообщаете нам, какие исключения вы получаете или нет. в какой строке это происходит. Рассмотрите возможность публикации SSCCE.   -  person Guillaume Polet    schedule 10.04.2013


Ответы (1)


person mKorbel    schedule 10.04.2013
comment
Но JTable был создан из XxxTableModel. Нет способа полностью восстановить JTable из XxxTableModel без замены новым JTable? - person Chameleon; 10.04.2013
comment
@Chameleon не является основным свойством, по умолчанию нет проблем с добавлением/удалением/изменением строки/столбца/ячейки, я бы предложил начать с DefaultTableModel, тогда влияние извне будет уменьшено, все методы доступны из JTable, так же, как и в DeafultTableModel, требуется использование преждевременного массива или вектора, но нет никакой разницы с HashMap, использование AbstractTableModel требует глубочайших знаний о TableModel и используемом массиве, уменьшите это беспокойство до необходимого минимума, а затем переключитесь с DefaultTableModel на AbstractTableModel (несколько строки кода кроме того) - person mKorbel; 10.04.2013