import javaxswing*; import javaxswingtableDefaultTableModel; import comsunjavaswingplafwindowsWindowsClassicLookAndFeel; import javaawt*; import javautilVector; /** * 测试JTable添加数据删除数据频繁操作JTable出现数组越界的处理 * 在工作中如果遇到频繁的操作Jtable的数据特别是速率很快的情况下经常会遇到 * Exception in thread AWTEventQueue javalangArrayIndexOutOfBoundsException * 这样的数组越界的异常这里引入Swing的一个线程能很好的解决这个问题 * 供同样遇到这样问题的人参考 * @author蒋家狂潮 * email: * */ public class ThreadTable extends JTable { private DefaultTableModel model; static String[] header = new String[] { id name sex age }; public ThreadTable() { model = new DefaultTableModel(header ); thissetModel(model); } public void deleteRows(int rowCount) throws Exception { if (rowCount >= modelgetColumnCount()) { throw new Exception(删除的行数不能超过model的总行数!); } else { for (int i = rowCount ; i >= ; i) { modelremoveRow(i); } } } public void testInsertValue() { final Vector<String> value = new Vector<String>(); valueadd(); valueadd(simon); valueadd(boy); valueadd(); Thread thread = new Thread() { public void run() { for (int i = ; i < ; i++) { //addValueWithThread(value);//这个方法不会出现越界 addValueWithoutThread(value);//这个方法会出现越界差别就在于加入一个线程 try { sleep(); } catch (InterruptedException e) { // TODO Autogenerated catch block eprintStackTrace(); } } } }; threadstart(); } /** * 将添加记录和删除记录在一个线程里走不会出现页面刷新的时候数组越界的问题 * @param value */ public void addValueWithThread(final Vector value) { Thread thread = new Thread() { public void run() { Runnable runnable = new Runnable() { public void run() { modeladdRow(value); if (modelgetRowCount() > ) { try { deleteRows(); } catch (Exception e) { // TODO Autogenerated catch block eprintStackTrace(); } } } }; SwingUtilitiesinvokeLater(runnable); } }; threadstart(); } /** * 这样一边添加记录一边删除记录会出现数组越界的情况 * @param value */ public void addValueWithoutThread(final Vector value) { modeladdRow(value); if (modelgetRowCount() > ) { try { deleteRows(); } catch (Exception e) { // TODO Autogenerated catch block eprintStackTrace(); } } } public static void main(String[] args) { try { UIManagersetLookAndFeel(new WindowsClassicLookAndFeel()); } catch (UnsupportedLookAndFeelException e) { // TODO Autogenerated catch block eprintStackTrace(); } JFrame f = new JFrame(); fgetContentPane()setLayout(new BorderLayout()); ThreadTable table = new ThreadTable(); JScrollPane scroll = new JScrollPane(table); fgetContentPane()add(scroll BorderLayoutCENTER); fsetSize( ); fsetLocation( ); fsetVisible(true); tabletestInsertValue(); } } |