我用两个Vector分别作为表头名和数据创建一个DefaultTableModel,然后用这个DefaultTableModel创建了一个JTable,然后用这个表创建了一个JScrollPane.放进窗口中显示,之后我又创建了一个线程用以刷新表内容,该线程代码如下:
public void run() {
int i, j;
while (!pause.finish) {
dtm.setRowCount(0); //清空表 dtm是表的模型
for (j = 0; j < pcb.size(); j++) { // 重绘表 pcb是一个链表LinkedList
v = new Vector();
v.add(pcb.get(j).id);
v.add(pcb.get(j).name);
v.add(pcb.get(j).youxian);
v.add(pcb.get(j).gettime);
v.add(pcb.get(j).time);
v.add(pcb.get(j).worktime);
v.add(pcb.get(j).iotime);
v.add(pcb.get(j).state);
dtm.addRow(v);
}
dtm.fireTableDataChanged();
try { //每500毫秒刷新一次
sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(flash.class.getName()).log(Level.SEVERE, null, ex);
}
while (pause.p) { //暂停按钮实现
try {
sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(flash.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
我运行此程序,概率性(约10%概率)出现以下错误(此错误在用鼠标不停地快速改变表行列宽度时几乎增加到90%):
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Vector.java:427)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)
at javax.swing.JTable.getValueAt(JTable.java:2686)
at javax.swing.JTable.prepareRenderer(JTable.java:5703)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072)
后面还有很多(但是没有一条是指向我的代码,全部指向系统代码),该错误不影响我的程序的正常运行,但是看着很郁闷.我知道这个是线程同步和互斥导致的问题,但是我把上面有关Vector的代码弄进一个synchronized修饰的方法中,也出现这种错误.请高手赐教啊!
------解决方案--------------------
上述信息在你不按鼠标时出现吗?
------解决方案--------------------
debug, 光这段代码看不出来什么问题。
------解决方案--------------------
我以前遇到过类似的情况,是因为线程启动引起的。