代码之家  ›  专栏  ›  技术社区  ›  ItFreak

jTableModel行添加错误

  •  0
  • ItFreak  · 技术社区  · 7 年前

    这是我的桌子模型:

    public class ScheduledRecordsTableModel extends AbstractTableModel {
        private String[] headers = {"Interpret", "Titel"};
        private List<ScheduledRecord> scheduledRecords;
    
        public ScheduledRecordsTableModel(List<ScheduledRecord> recordsList) {
            super();
            this.scheduledRecords = recordsList;
        }
    
        @Override
        public int getRowCount() {
            return scheduledRecords.size();
        }
    
        @Override
        public int getColumnCount() {
            return 2;
        }
    
        @Override
        public String getColumnName(int column) {
            return headers[column];
        }
    
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            ScheduledRecord r = scheduledRecords.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    return r.getActor();
                case 1:
                    return r.getTitle();
                default:
                    return null;
            }
    
    
        }
    
        public void addRow(ScheduledRecord r) {
            ScheduledRecord toAdd = null;
            for (Iterator<ScheduledRecord> recordIterator = scheduledRecords.iterator(); recordIterator.hasNext(); ) {
                ScheduledRecord record = recordIterator.next();
                if (record.equals(r)) {
                    throw new IllegalArgumentException("Scheduled Record " + r.toString() + " already exists");
                } else {
                    toAdd = record;
                }
            }
            scheduledRecords.add(toAdd);
        }
    
        public void removeRow(ScheduledRecord r) {
            scheduledRecords.remove(r);
            fireTableDataChanged();
        }
    
        public ScheduledRecord getScheduledRecordFromIndex(int index) {
            return scheduledRecords.get(index);
        }
    
        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }
    }
    

    以下是我如何添加新条目:

    private void saveScheduledRecord() {
        if (checkInputValues()) {
            WebradioPlayer.addScheduledRecord(new ScheduledRecord(titleField.getText(), artistField.getText()));
            this.dispose();
        } else {
            JOptionPane.showMessageDialog(this, "Please enter a valid artist/title", "Invalid input", JOptionPane.ERROR_MESSAGE);
            throw new IllegalArgumentException("artist or title input did not match the specifications");
        }
    }
    

    这里是addscheduledrecord方法:

    public static synchronized boolean addScheduledRecord(ScheduledRecord record) {
        RecorderController.getInstance().addScheduledRecord(record);
        Gui.getInstance().getRecorderTab().getScheduledRecordsWindow().getTable().getScheduledRecordsTableModel().addRow(record);
        Gui.getInstance().getRecorderTab().getScheduledRecordsWindow().getTable().getScheduledRecordsTableModel().fireTableDataChanged();
        databaseConnector.addScheduledRecord(record);
        return true;
    }
    

    如果我添加一个条目,“上一个”条目将被添加到表中,但是如果我关闭表并再次打开它,则一切都是正确的。RecorderController仅为其他目的保留自己的列表(此列表以其他方式修改) 有人看到我的错误了吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Teddy    7 年前

    这应该修复addrow方法(不需要迭代,而有一个contains方法):

    public void addRow(ScheduledRecord r) {
        if (scheduledRecords.contains(r)) {
            throw new IllegalArgumentException("Scheduled Record " + r.toString() + " already exists");
        }
        scheduledRecords.add(r);
    }