удалить строки из JTable с помощью AbstractTableModel

Я хотел бы удалить выбранную строку из JTable с помощью AbstractTableModel с помощью кнопки.

Код ниже работает с DefaultTableModel:

...
MyTableModel mtb;
...
private String[]....
private Object[][]...
...
JTable table = new JTable(mtb)
JButton delete;
...
 public void actionPerformed(ActionEvent e) {

        if(e.getSource().equals(delete))
         {
                 if(table.getSelectedRow()<0)
                 {
                  JOptionPane.showMessageDialog(this,"Select row");

                 }
                 else
                 {
                     mtb.removeRow(table.getSelectedRow()); 

                 }
         }
     }

но это не работает с AbstractTablemodel.

У меня небольшой беспорядок в коде, поэтому вот пример Java со страницы оракула, который можно использовать:

Спасибо!


person TheSpaceboy0    schedule 14.12.2012    source источник
comment
Это не работает, так как этот метод не определен. Просто добавьте такой метод в свой TableModel и убедитесь, что этот метод запускает правильные события. Обратите внимание, что код в вашем вопросе не имеет отношения к предложению решения. Нам понадобится ваш TableModel iso метод actionPerformed, чтобы дать полезный совет   -  person Robin    schedule 14.12.2012
comment
Хорошо, я думал, что есть такой же определенный метод, как и в DefaultTableModel, но теперь я знаю, что мне нужно его определить. Спасибо.   -  person TheSpaceboy0    schedule 14.12.2012


Ответы (2)


Для AbstractTableModel вы должны реализовать свой собственный removeRow() на основе внутренней структуры данных вашей модели, но вы можете изучить источник DefaultTableModel в качестве руководства по тому, какое событие (я) запускать. Например,

public void removeRow(int row) {
    // remove a row from your internal data structure
    fireTableRowsDeleted(row, row);
}
person trashgod    schedule 14.12.2012
comment
Я нашел более подходящий совет: добавить данные в существующий массив непросто, вам нужно создать новый массив большего размера, чем старый, скопировать все данные, а затем добавить новый элемент. Гораздо лучше использовать Vector или ArrayList. - person TheSpaceboy0; 14.12.2012
comment
Я нашел более подходящий совет наш волшебный хрустальный шар, вероятно, не смог обнаружить, что вы использовали массив в качестве внутренней структуры данных. +1 за этот ответ, который лучше всего можно сделать с доступной информацией в вопросе. - person Robin; 14.12.2012
comment
Хотя Vector не объявлен устаревшим, он является устаревшим классом. Рассмотрите возможность кодирования интерфейса, например. List<Row>, который позволяет изменять реализации по мере необходимости - person trashgod; 15.12.2012

DefaultTableModel сам вызовет fireXX методов при изменении модели таблицы. Но если мы используем AbstractTableModel, то мы должны явно вызывать методы fireXX. Поэтому, когда в таблице есть изменения, просто вызовите соответствующий метод fireXX.

Для,

вставка новой строки в таблицу с помощью fireTableRowsInserted

удаление (в вашем случае) используйте fireTableRowsDeleted

обновить используйте fireTableRowsUpdated

ПРИМЕЧАНИЕ. В DefaultTableModel реализовано больше всего методов. Так что, если нет реальной необходимости, используйте AbstractTableModel, иначе придерживайтесь DefaultTableModel.

person Amarnath    schedule 15.12.2012