У меня большая проблема с JTable
. Вот как это работает:
- пользователь добавляет новый
Shape
к Model
Controller
обновляет Model
и отправляет уведомление View
для обновления
View
получает данные из Model
и отображает их
Я использую addRow(...)
метод для добавления строк фигур. Но он добавляет целые List
фигур к текущим данным (поэтому я получаю это: shape1, shape1, shape2, shape1, shape2, shape3 для трех фигур) Я пытался как-то удалить строки или setRowCount(0)
, но ни одна из них не работала правильно.
TableModel
package dpo.mvc.view.table;
import javax.swing.table.DefaultTableModel;
import dpo.mvc.model.Shape;
import dpo.mvc.view.View;
import dpo.mvc.view.ViewListener;
@SuppressWarnings("serial")
public class CustomTableModel extends DefaultTableModel implements ViewListener {
private View view;
public CustomTableModel(View view, String ... columns) {
this.view = view;
this.setColumnIdentifiers(columns);
this.addTableModelListener(new TableListener(view));
}
@Override
public boolean isCellEditable(int row, int column) {
return column != 0;
}
private void load() {
for (Shape shape : view.getModel().getShapesList()) {
this.addRow(new Object[] {shape.getId(), shape.getPositionX(), shape.getPositionY(), shape.getSize()});
}
}
@Override
public void render() {
load();
}
}
TableListener
package dpo.mvc.view.table;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import dpo.mvc.view.View;
public class TableListener implements TableModelListener {
private View view;
public TableListener(View view) {
this.view = view;
}
@Override
public void tableChanged(TableModelEvent e) {
int changedRow = e.getFirstRow();
String[] shapeData = getData();
if (e.getType() == TableModelEvent.UPDATE) {
view.getController().shapeChanged(shapeData);
}
}
}