Как правильно очистить, добавить или отредактировать данные в JTable?А как управлять TableModelListener? - PullRequest
2 голосов
/ 22 ноября 2011

У меня большая проблема с 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);
        }
    }

}

1 Ответ

2 голосов
/ 23 ноября 2011

Если Shape должен появиться в другом компоненте, зарегистрируйте класс, содержащий этот компонент, как TableModelListener, используя addTableModelListener() метод вашего TableModel. Если Shape должен появиться в JTable, вы, вероятно, захотите реализовать TableCellRenderer, как описано в Как использовать таблицы: использование пользовательских средств визуализации и показано здесь .

...