我正在使用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)
答案 0 :(得分:3)
您的代码中存在一个小错误。下次,小心..
在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(...)”函数。但由于它没有覆盖,它什么都不做(你必须覆盖它,原始方法没有体)。
希望这会有所帮助..
答案 1 :(得分:1)
您可以使用defaultTableModal进行正常使用。它扩展了abstractTableModal并提供了常用需求的方法。先尝试一下,如果还不够,那就去开发自己的班级......