JTable
我遇到了很大的问题。以下是它的工作原理:
Shape
添加到Model
Controller
更新Model
并向View
发送通知以进行更新View
从Model
获取数据并将其呈现我使用addRow(...)
方法添加形状行。但它将整个List
形状添加到curent数据中(所以我得到了: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);
}
}
}
答案 0 :(得分:2)
如果要将Shape
显示在另一个组件中,请使用TableModelListener
的{{3}}方法将包含该组件的类注册为TableModel
。如果Shape
意图出现在JTable
中,您可能希望实施TableCellRenderer
,如addTableModelListener()
中所述,并显示How to Use Tables: Using Custom Renderers。