簡體   English   中英

jTable細胞不會改變

[英]jTable cell dont change

我正在使用java和mySQL創建一個數據庫管理系統。 我正在使用jTable作為數據庫的接口。

雖然帖子看起來不長,但對於有經驗的人來說,問題不會那么復雜(我猜)。

這是我的問題。 選擇一個單元格后,我可以輸入值,(沒有問題)。 但是在輸入值之后,當我點擊其他一些單元格時,輸入的值會消失並返回null。

無法弄清楚原因。 我對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;

}

希望我已經提供了所有細節。 這對我來說是一個真正的錯誤。 任何幫助表示贊賞。 Thanx提前..!

(如果需要澄清,請告訴我..很難發布整個項目。這有點大..:D)

你的代碼中有一個小錯誤。 下次,小心..

在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(...)”函數。 但由於它沒有覆蓋,它什么都不做(你必須覆蓋它,原始方法沒有主體)。

希望這可以幫助..

您可以使用defaultTableModal進行正常使用。 它擴展了abstractTableModal並提供了常用需求的方法。 先嘗試一下,如果還不夠,那就去開發自己的班級......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM