Wie werden Daten in JTable richtig gelöscht, hinzugefügt oder bearbeitet? Und wie kann ich TableModelListener steuern?

  • Ich habe ein großes Problem mit JTable. So funktioniert es:

    • Ein Benutzer fügt ein neues 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);
            }
        }
    
    }
     
    22 November 2011
    user219882
0 answers