Ячейка jTable не меняется

Я делаю систему управления базами данных, используя java и mySQL. Я использую jTable как интерфейс к базе данных.

Хотя пост выглядит немного длинным, проблема не будет такой уж сложной для опытного человека (я думаю).

Это моя проблема. После выбора ячейки я могу ввести значения (без проблем). Но после ввода значений, когда я нажимаю на другую ячейку, введенные значения исчезают, и они возвращаются к нулю.

Не могу понять причину. У меня нет большого опыта работы с jTables. Но я думаю, что проблема с tablemodel.

Это моя модель стола

import Templates.TableEntry;
import java.util.LinkedList;
import javax.swing.table.AbstractTableModel;

public class myTableModel extends AbstractTableModel {

public static final int DATE_INDEX = 0;
public static final int ORDERNO_INDEX = 1;
public static final int ROOT_INDEX = 2;
public static final int HIDDEN_INDEX = 3;
public String[] columnnames;
public LinkedList<TableEntry> entryList;

public myTableModel(String[] columnNames) {
    this.columnnames = columnNames;
    entryList = new LinkedList<TableEntry>();
}

@Override
public String getColumnName(int column) {
    return columnnames[column];
}

@Override
public boolean isCellEditable(int row, int column) {
    if (column == HIDDEN_INDEX) {
        return false;
    } else {
        return true;
    }
}

@Override
public Class getColumnClass(int column) {
    return String.class;
}

@Override
public String getValueAt(int row, int column) {
    TableEntry record = entryList.get(row);
    switch (column) {
        case DATE_INDEX:
            return record.date;
        case ORDERNO_INDEX:
            return record.jobOdrerNo;
        case ROOT_INDEX:
            return record.rootCardNos;
        default:
            return null;
    }
}

public void setValueAt(String value, int row, int column) {
    TableEntry record = entryList.get(row);
    switch (column) {
        case DATE_INDEX:
            record.date = value;
            break;
        case ORDERNO_INDEX:
            record.jobOdrerNo = value;
            break;
        case ROOT_INDEX:
            record.rootCardNos = value;
            break;
        default:
            System.out.println("invalid index");
    }
    updateTable(row, column);
}

public void updateTable(int row, int column) {
    fireTableCellUpdated(row, column);
}

@Override
public int getRowCount() {
    return entryList.size();
}

@Override
public int getColumnCount() {
    return columnnames.length;
}

public boolean hasEmptyRow() {
    if (entryList.size() == 0) {
        return false;
    }
    TableEntry entry = entryList.get(entryList.size() - 1);
    if ("".equals(entry.date)) {
        return true;
    } else {
        return false;

    }
}

public void addEmptyRow() {
    entryList.add(new TableEntry());
    fireTableRowsInserted(entryList.size() - 1, entryList.size() - 1);
}

public void deleteRow(int i) {
    if (i != 0) {
        entryList.remove(i);
        fireTableRowsDeleted(i - 1, i + 1);
    }
}

}

Извините за длину. Но я разместил весь код для полноты картины. Большую часть деталей можно не учитывать.

TableEntry — это простой класс.

package Templates;

public class TableEntry {

public String date;
public String jobOdrerNo;
public String rootCardNos;
public String yardRootCard;
public String MCISO_NO;
public String service_maintenance_breakdown;
public String jobNo;
public String machineName;
public String fault;
public String problematicPart;
public String person;
public String action;
public String startTime;
public String finishedTime;
public String durationOfRepair;
public String spareParts;
public String itemCode;
public String no;
public String value;
public String totalCost;
public String remark;
public String breakdownAndSolution;

}

Надеюсь, я предоставил все детали. Это была настоящая ошибка для меня. Любая помощь приветствуется. Заранее спасибо..!

(Если нужны какие-либо разъяснения, пожалуйста, дайте мне знать.. сложно опубликовать весь проект. Он немного огромен..: D)


person Sumudu    schedule 24.07.2012    source источник
comment
(Если нужны какие-либо разъяснения, пожалуйста, дайте мне знать.. сложно опубликовать весь проект. Он немного громоздкий.. :D) Попробуйте сделать пример редактирования таблицы, где TableEntry имеет 2 поля и в таблице всего 2 строки. Жестко закодируйте данные, чтобы выделить БД. Если этот SSCCE не работает, и вы не можете понять, почему, опубликуйте его как редактирование вопроса.   -  person Andrew Thompson    schedule 24.07.2012


Ответы (2)


В вашем коде есть небольшая ошибка. В следующий раз будьте осторожны..

В методе tablemodel "setValueAt (---)" вы указали неправильные аргументы. вы пытались переопределить метод класса «AbstractTableModel». Оригинальный метод,

public void setValueAt(Object aValue, int rowIndex, int columnIndex){
}

Но вы написали свой метод как

public void setValueAt(String value, int row, int column) {
...//method body
}

Следовательно, он не переопределит предполагаемую функцию. Каждый раз, когда изменяется ячейка, tablemodel будет вызывать исходную функцию «setValueAt(...)». Но поскольку он не был переопределен, он ничего не сделает (вы должны переопределить его, исходный метод не имеет тела).

Надеюсь это поможет..

person Community    schedule 24.07.2012
comment
он не переопределяет предполагаемую функцию Вот где нотация @Override может быть очень полезной. - person Andrew Thompson; 24.07.2012

Вы можете использовать defaultTableModal для обычного использования. Он расширил abstractTableModal и предоставляет методы для часто используемых требований. Сначала попробуй, если не хватит, тогда иди разрабатывай свой класс...

person Community    schedule 24.07.2012