Java: как заставить fireTableStructureChanged изменить AbstractTableModel?

Я сделал пользовательскую модель AbstractTableModel. Конструктор инициализирует модель данными из файла. Однако я хочу добавить в модель дополнительный столбец (это связано с ограничениями SQL в его столбцах).

Я пытаюсь добиться этого, добавляя в код инициализации вызов метода addColumn(String columnName, Vector columnData).

Этот метод addColumn в моей пользовательской модели AbstractTableModel получен непосредственно из метода addColumn модели DefaultTableModel, включая «fireTableStructureChanged()».

Тем не менее, когда я запускаю этот код, кажется, что fireTableStructureChanged() не добавляет мой новый столбец, а JTable отображает только данные из файла. Почему это может быть?

Вот краткое описание кода, который я использую:

public class Dummy extends AbstractTableModel {
    public Dummy() {
        //load data from SQL file into ResultSets
        //transfer ResultSet.metadata into columnHeaders Vector<String>
        //transfer ResultSet.data into columnDatums Vector<String>
        fireTableChanged(null);
        addColumn("Added Heading", (Vector)null);
    }

    public addColumn(String columnHeader, Vector columnData) {
         columnHeaders.add(columnHeader);
         // transfer columnData into columnDatums
         fireTableStructureChanged();
    }
 }

Это проблема слушателя - в данный момент никто не слушает fireTableStructureChanged()?


person Arvanem    schedule 03.04.2012    source источник
comment
пожалуйста, изучите соглашения об именах Java и придерживайтесь их   -  person kleopatra    schedule 04.04.2012
comment
@kleopatra - спасибо, но я их знаю. dummy — это не более чем одноразовое имя класса для целей переполнения стека!   -  person Arvanem    schedule 04.04.2012
comment
это режет глаза потенциальным помощникам :-) Что не может быть тем, чего вы хотите...   -  person kleopatra    schedule 04.04.2012
comment
@kleopatra: так верно! Я изменил фрагмент кода. Урок оценен!   -  person Arvanem    schedule 04.04.2012


Ответы (1)


Вам нужно будет указать свою реализацию трех обязательных (то есть нереализованных) методов, указанных интерфейсом TableModel в AbstractTableModel. В частности, getColumnCount() и getRowCount() должны возвращать обновленные значения. Методы fireXxx() просто указывают представлению запрашивать модель через getValueAt(). Данные должны быть там, ожидая получения getValueAt(). EnvTableTest — простой пример. Кроме того, рассмотрите более современную альтернативу Vector, которая включает в себя, возможно, ненужный код синхронизации.

person trashgod    schedule 04.04.2012
comment
+1 за ваш вдумчивый и подробный ответ. Я рассмотрю методы и попытаюсь решить проблему так, как вы предлагаете. Если это сработает, я приму ваш ответ. Если я буду бороться, я добавлю код к вопросу. Большое спасибо - person Arvanem; 04.04.2012
comment
вы были совершенно правы. Мне нужно было убедиться, что getColumnCount() и getRowCount() возвращают обновленные значения. Спасибо за отличный ответ и понимание. - person Arvanem; 04.04.2012
comment
Пожалуйста; рад, что это работает. Для справки см. также Когда абстрактный класс реализует интерфейс< /и>. - person trashgod; 04.04.2012
comment
Всем будущим читателям: чтобы избежать исключений ArrayIndexOutOfBounds в getValueAt(), мне также пришлось принять метод justifyRows() DefaultTableModel и реорганизовать данные столбца в вектор векторов объектов для использования justifyRows(). - person Arvanem; 04.04.2012