如何在JTable中正确清除,添加或编辑数据?以及如何控制TableModelListener?

时间:2011-11-22 00:00:08

标签: java swing jtable actionlistener

JTable我遇到了很大的问题。以下是它的工作原理:

  • 用户将新Shape添加到Model
  • Controller更新Model并向View发送通知以进行更新
  • ViewModel获取数据并将其呈现

我使用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);
        }
    }

}

1 个答案:

答案 0 :(得分:2)

如果要将Shape显示在另一个组件中,请使用TableModelListener的{​​{3}}方法将包含该组件的类注册为TableModel。如果Shape意图出现在JTable中,您可能希望实施TableCellRenderer,如addTableModelListener()中所述,并显示How to Use Tables: Using Custom Renderers