隨筆-50  評(píng)論-55  文章-8  trackbacks-0

          import javax.swing.*;
          import javax.swing.table.DefaultTableModel;
          import com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel;
          import java.awt.*;
          import java.util.Vector;
          /**
          ?* 測(cè)試JTable添加數(shù)據(jù),刪除數(shù)據(jù)頻繁操作,JTable出現(xiàn)數(shù)組越界的處理
          ?* 在工作中如果遇到頻繁的操作Jtable的數(shù)據(jù),特別是速率很快的情況下,經(jīng)常會(huì)遇到
          ?* Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException
          ?* 這樣的數(shù)組越界的異常,這里引入Swing的一個(gè)線程,能很好的解決這個(gè)問(wèn)題
          ?* 供同樣遇到這樣問(wèn)題的人參考。
          ?* @author?蔣家狂潮
          ?* email:simon1006@163.com
          ?*
          ?*/
          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("刪除的行數(shù)不能超過(guò)model的總行數(shù)!");
          ??} 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);//這個(gè)方法不會(huì)出現(xiàn)越界
          ?????addValueWithoutThread(value);//這個(gè)方法會(huì)出現(xiàn)越界,差別就在于加入一個(gè)線程
          ?????try {
          ??????sleep(10);
          ?????} catch (InterruptedException e) {
          ??????// TODO Auto-generated catch block
          ??????e.printStackTrace();
          ?????}
          ????}
          ???}
          ??};
          ??thread.start();
          ?}
          ??? /**
          ???? * 將添加記錄和刪除記錄在一個(gè)線程里走,不會(huì)出現(xiàn)頁(yè)面刷新的時(shí)候,數(shù)組越界的問(wèn)題
          ???? * @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();
          ?}
          ?/**
          ? * 這樣一邊添加記錄,一邊刪除記錄,會(huì)出現(xiàn)數(shù)組越界的情況
          ? * @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();
          ?}
          }

          posted on 2008-07-30 11:48 蔣家狂潮 閱讀(1777) 評(píng)論(3)  編輯  收藏 所屬分類: Swing

          評(píng)論:
          # re: Swing之JTable運(yùn)用線程一個(gè)測(cè)試[未登錄](méi) 2008-07-30 22:37 | gavin
          這個(gè)是什么原因呢??  回復(fù)  更多評(píng)論
            
          # re: Swing之JTable運(yùn)用線程一個(gè)測(cè)試[未登錄](méi) 2008-08-01 16:35 | wolfsquare
          關(guān)鍵在SwingUtilities.invokeLater(runnable);上,和線程沒(méi)關(guān)系  回復(fù)  更多評(píng)論
            
          # re: Swing之JTable運(yùn)用線程一個(gè)測(cè)試 2008-08-04 15:51 | Qil.Wong
          嗯,wolfsquare說(shuō)的對(duì),SwingUtilities.invokeLater(runnable)將runnable操作放在Swing的EDT線程上,會(huì)挨個(gè)兒執(zhí)行,不會(huì)同時(shí)執(zhí)行,就不會(huì)產(chǎn)生溢出。這個(gè)和SwingWorker的publish很類似。  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 山阴县| 洞口县| 南京市| 平安县| 云南省| 敦煌市| 锦屏县| 封开县| 广南县| 杭州市| 甘肃省| 津市市| 文水县| 雷波县| 克山县| 岢岚县| 云龙县| 湖北省| 盈江县| 沂源县| 绵竹市| 南郑县| 盘山县| 高清| 岱山县| 石渠县| 白水县| 拜泉县| 桦川县| 东平县| 长沙县| 怀化市| 宁德市| 高密市| 寿光市| 历史| 阿图什市| 九寨沟县| 渑池县| 霸州市| 石阡县|