I have a big problem with JTable. Here is how it works:
- a user adds a new
ShapetoModel ControllerupdatesModeland sends a notification toViewto updateViewgets data fromModeland renders them
I use addRow(...) method to add rows of shapes. But it adds the whole List of shapes to the curent data (so I get this: shape1, shape1, shape2, shape1, shape2, shape3 for three shapes). I tried to delete rows somehow or setRowCount(0) but none of it worked correctly.
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);
}
}
}
If the
Shapeis meant to appear in another component, register the class containing that component as aTableModelListenerusing theaddTableModelListener()method of yourTableModel. If theShapeis meant to appear in theJTable, you’ll probably want to implementTableCellRenderer, as discussed in How to Use Tables: Using Custom Renderers and shown here.