程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Swing之JTable運用線程一個測試

Swing之JTable運用線程一個測試

編輯:關於JAVA

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel;
import java.awt.*;
import java.util.Vector;
/**
* 測試JTable添加數據,刪除數據頻繁操作,JTable出現數組越界的處理
* 在工作中如果遇到頻繁的操作Jtable的數據,特別是速率很快的情況下,經常會遇到
* Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException
* 這樣的數組越界的異常,這裡引入Swing的一個線程,能很好的解決這個問題
* 供同樣遇到這樣問題的人參考。
* @author蔣家狂潮
* email:[email protected]
*
*/
public class ThreadTable extends JTable {
private DefaultTableModel model;
static String[] header = new String[] { "id", "name", "sex", "age" };
public ThreadTable() {
  model = new DefaultTableModel(header, 0);
  this.setModel(model);
}
public void deleteRows(int rowCount) throws Exception {
  if (rowCount >= model.getColumnCount()) {
  throw new Exception("刪除的行數不能超過model的總行數!");
  } else {
  for (int i = rowCount - 1; i >= 0; i--) {
   model.removeRow(i);
  }
  }
}
public void testInsertValue() {
  final Vector<String> value = new Vector<String>();
  value.add("0");
  value.add("simon");
  value.add("boy");
  value.add("21");
  Thread thread = new Thread() {
  public void run() {
   for (int i = 0; i < 100000; i++) {
   //addValueWithThread(value);//這個方法不會出現越界
   addValueWithoutThread(value);//這個方法會出現越界,差別就在於加入一個線程
   try {
    sleep(10);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   }
  }
  };
  thread.start();
}
   /**
   * 將添加記錄和刪除記錄在一個線程裡走,不會出現頁面刷新的時候,數組越界的問題
   * @param value
   */
public void addValueWithThread(final Vector value) {
  Thread thread = new Thread() {
  public void run() {
   Runnable runnable = new Runnable() {
   public void run() {
    model.addRow(value);
    if (model.getRowCount() > 5) {
    try {
     deleteRows(2);
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    }
   }
   };
   SwingUtilities.invokeLater(runnable);
  }
  };
  thread.start();
}
/**
  * 這樣一邊添加記錄,一邊刪除記錄,會出現數組越界的情況
  * @param value
  */
public void addValueWithoutThread(final Vector value) {
    model.addRow(value);
    if (model.getRowCount() > 5) {
    try {
     deleteRows(2);
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    }
}
public static void main(String[] args) {
  try {
  UIManager.setLookAndFeel(new WindowsClassicLookAndFeel());
  } catch (UnsupportedLookAndFeelException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  JFrame f = new JFrame();
  f.getContentPane().setLayout(new BorderLayout());
  ThreadTable table = new ThreadTable();
  JScrollPane scroll = new JScrollPane(table);
  f.getContentPane().add(scroll, BorderLayout.CENTER);
  f.setSize(800, 600);
  f.setLocation(250, 250);
  f.setVisible(true);
  table.testInsertValue();
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved