Я читал о 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);
}