Java: прослушиватель JTable в AbstractTableModel, похоже, не работает

Я читал о TableModelListener (http://www.cs.auckland.ac.nz/compsci230s1c/lectures/xinfeng/swingmodelview.pdf) уже некоторое время, и я пытаюсь реализовать Listener для JTable, который использует AbstractTableModel. Чтобы объяснить различные части моей программы мой класс. Мой основной класс extends JFrame и implements TableModelListener, поэтому у меня есть этот метод tableChanged.

@Override
public void tableChanged(TableModelEvent e) {

    if (e.getType() == TableModelEvent.UPDATE)
        System.out.println("It is updated");
    if (e.getType() == TableModelEvent.DELETE)
        System.out.println("It is deleted");
    }

Мой класс SwitchTableModel, который extends AbstractTableModel не является конструктором, создает таблицу, в которой отображаются некоторые значения, взятые из некоторых других массивов. Часть реализации находится здесь Отображение следующей строки Список в JTable .

Я использую конструктор для вызова класса SwitchTableModel и создания JTable и JFrame.

Я также добавил эту строку, чтобы узнать, когда значение обновляется.

 public Object getValueAt(int rowIndex, int columnIndex) {
        fireTableCellUpdated(rowIndex, columnIndex); ...

Дело в том, что я хотел бы иметь возможность редактировать свой JTable, а затем сохранять его данные, но хотя кажется, что я мог бы его редактировать, когда я пишу что-то например в пустом поле и нажимаю ввод, он не сохраняет данные . То же самое происходит, когда я пытаюсь изменить что-то в непустом поле.

На самом деле, с этим кодом он продолжает печатать «Это отредактировано» все время, пока JFrame остается открытым.

Любая идея, что я могу делать неправильно?

***** РЕДАКТИРОВАТЬ ***** Мой конструктор выглядит так:

final SwitchTableModel model = new SwitchTableModel(user_decide);

    JTable table = new JTable(model);
    JFrame frame = new JFrame ("Results");

    table.getModel().addTableModelListener(this); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add (toolbar, BorderLayout.PAGE_START);
    frame.getContentPane().add (
        new JScrollPane(
        table, 
        JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
        JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED),    
        BorderLayout.CENTER);
    //frame.add(checkPanel, BorderLayout.PAGE_END);
   frame.pack();
   frame.setVisible(true);

}


person Dimitra Micha    schedule 18.02.2013    source источник
comment
Вставьте соответствующий код здесь. Все, что я могу сказать, это то, что модель, которая создает таблицу, неверна. И этот getValueAt() не имеет никакого отношения к запуску события: он не должен изменять модель, а получать от нее значение.   -  person JB Nizet    schedule 18.02.2013
comment
Вам нужно будет зарегистрировать своего слушателя в своей таблице - не могли бы вы показать нам, где вы это делаете?   -  person Boris the Spider    schedule 18.02.2013
comment
Нет необходимости вызывать fireTableCellUpdated(...) в методе getValueAt(). Это делается в методе setVALueAt(). Если ваш код не работает, проблема, скорее всего, в вашей собственной TableModel. Опубликуйте свой SSCCE, демонстрирующий проблему. Хотя более простое решение, вероятно, состоит в том, чтобы просто использовать DEfaultTableModel.   -  person camickr    schedule 18.02.2013
comment
@camickr Хотел бы я использовать модель таблицы по умолчанию. Но я использовал этот, чтобы все работало для моего пользовательского интерфейса.   -  person Dimitra Micha    schedule 18.02.2013