Ich habe ein großes Problem mit JTable
. So funktioniert es:
Shape
zu Model
Controller
hinzu. aktualisiert Model
und sendet eine Benachrichtigung an View
zum Aktualisieren View
ruft Daten von Model
ab und gibt sie wieder Ich benutze die Methode addRow(...)
, um Reihen von Formen hinzuzufügen. Es fügt jedoch die gesamten List
von Formen zu den aktuellen Daten hinzu (daher bekomme ich Folgendes: shape1, shape1, shape2, shape1, shape2, shape3 für drei Formen). Ich habe versucht, Zeilen oder setRowCount(0)
irgendwie zu löschen, aber es funktionierte nicht richtig.
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);
}
}
}