1

私はjavaとmySQLを使用してデータベース管理システムを作成しています。データベースへのインターフェースとしてjTableを使用しています。

投稿は少し長く見えますが、経験豊富な人にとっては、問題はそれほど複雑ではありません(私は推測します)。

これが私の問題です。セルを選択した後、値を入力できます(問題はありません)。しかし、値を入力した後、他のセルをクリックすると、入力した値が消えてnullに戻ります。

理由がわからない。jTablesの経験はあまりありません。しかし、問題はテーブルモデルにあると思います。

これは私のテーブルモデルです

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)

4

2 に答える 2

3

コードに小さなバグがあります。次回は気をつけて。

テーブルモデルのメソッド「setValueAt(---)」に間違った引数を入れました。クラス「AbstractTableModel」のメソッドをオーバーライドしようとしていました。元の方法は、

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

しかし、あなたはあなたのメソッドを次のように書いています、

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

したがって、意図した機能を上書きすることはありません。セルが変更されるたびに、tablemodelは元の「setValueAt(...)」関数を呼び出します。ただし、オーバーライドされていないため、何も実行されません(オーバーライドする必要があります。元のメソッドには本体がありません)。

お役に立てれば..

于 2012-07-24T07:45:30.570 に答える
1

通常の使用にはdefaultTableModalを使用できます。abstractTableModalを拡張し、頻繁に使用される要件のメソッドを提供します。最初に試してみてください。十分でない場合は、独自のクラスを開発してください...

于 2012-07-24T08:24:19.693 に答える