继上次JTable实现号码分布的博文之后,这次写一下关于JTable数据的更新、删除、插入吧。
同样的,本文将以abstractTableModel为例,其他数据导入方式可以参考。主界面如下:
数据从文件导入,首先是添加。添加的时候会弹出一个对话框,提示输入插入的相关信息,这里不做叙述。添加时,会判断期数对不对(即有无重复的期数),判断方式如下:
for(int i=0; i<histroyDataTableMode.getRowCount(); i++) {
if(histroyDataTableMode.getValueAt(i, 0).equals(stageValue)) {
JOptionPane.showMessageDialog(null, "期数不对:\n所插入的期数已经存在!");
validInput = false;
break;
}
}
使用getValueAt获取第一列的值,与输入的stageValue作比较。然后showDialog即可。判断正确后,即写入文件,写入文件部分,,,以后再写吧。现在不高兴写,太累了, 大中午的想睡觉 - -! 文件写完后更新table,更新table如下:
// 在表中显示
AnalyseDataInfo dataToInsert = new AnalyseDataInfo();
dataToInsert.SetStage(stageValue);
for(int i=0; i<6; i++) {
dataToInsert.SetRedBall(i, redBallVale[i]);
}
dataToInsert.SetBlueBall(blueBallValue);
histroyDataTableMode.add(dataToInsert);
其中add方法为:
public void add(AnalyseDataInfo data) {
int index = stageDatas.size();
stageDatas.add(data);
fireTableRowsInserted(index, index);
}
stageDatas为插入数据的一个全部变量链表,此处直接添加,然后fireTableRowsInserted即可。这是添加部分。
接下来是删除部分。删除部分大同小异,由于我是用AbstractTableModel,因此很简单的,在删除部分直接:
public void delete(int stage) {
for(int i=0; i<stageDatas.size(); i++) {
int stageInList = stageDatas.get(i).GetStage();
if(stage == stageInList) {
stageDatas.remove(i);
fireTableDataChanged();
break;
}
}
}
就大功告成。比较简单,嘿嘿。
最后便是更新数据了。更新数据也差不多,这里我提一下,在更新数据的过程中,一开始我直接使用的是AbstractTableModel的API:setValueAt更新,结果Table里面的数据死活不变,搞的我一开始是以为刷新不及时,然后尝遍各种刷新方法,什么repiant、updateUI、validate;也试过修改AbstractTableModel的各种fire,等等等等,各种蛋疼。结果到最后才发现原来是setValueAt这个API压根没起作用。气的我快疯了。setValueAt手册里描述如下:
setValueAt
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
- 由于提供了此空实现,因此,如果用户的数据模型是不可编辑的,则他们不必实现此方法。
总结,JTable只是一个显示内容的框体,正常幕后操作数据的,是实现的TableModel。
OK,本文到此结束。