Swing之JTable运用线程一个测试

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: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("删除的行数不能超过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();
}
}

时间: 2022-12-14

Swing之JTable运用线程一个测试的相关文章

用Swing的Jtable类让数据看起来更干净

数据 Swing颇受欢迎的JTable类为显示大块数据提供了一种简单的机制.JTable有很多东西是用于数据的生成和编辑,其中的很多东西还可以自定义,从而更进一步增强其功能.本文会引导你一步步地进入JTable的世界. Listing A包含了一个简单示例的代码,这个示例会说明常用JTable的行为.用户能够更改JTable的布局.拖放它的栏,或者通过拖动标题的分隔线来改变其大小. 这些列被保存在一个String数组里:String[] columnNames = {"Product"

可视化Swing中JTable控件绑定SQL数据源的两种方法深入解析

以下是对可视化Swing中JTable控件绑定SQL数据源的两种方法进行了详细的分析介绍,需要的朋友可以过来参考一下   在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方法.JTable的构造方法通过查阅Java的API,可以可以得到JTable的两个重要的构造方法:JTable(Object[][] rowData, Object[] colu

Swing之JTable的详细介绍(转)

表格(Table)的使用与介绍8-1:使用JTable组件:类层次结构图:java.lang.Object--java.awt.Component--java.awt.Container--javax.Swing.JComponent--javax.Swing.JTabel 一个CRUD的Demo package frame; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*;

java se-java swing awt, 如何实现一个按钮按下之后刷新界面

问题描述 java swing awt, 如何实现一个按钮按下之后刷新界面 outPrint.setText("其他地方数据正在清空...");//这个没有显示 outPrint.repaint();//没用 outPrint.validate();//没用 try { Thread.sleep(3000); } catch (InterruptedException e1) { e1.printStackTrace(); } 就是给个提示,正在清空,等一会(3000ms) 解决方案

Java Swing 之JTable及其简单的用法

我们都知道JTable需要使用一个Model配合才能更好地发挥其作用.而使用Model有好多种方法,但是难易程度却大大不同,比如说我们使用AbstractTableModel接口要实现里面的好多方法,相对于这一点,使用DefaulttableModel 就可以大大而简化我们的工作量,我们只需要实现自己需要的方法就可以了.下面是一个简单的使用案例: package UsefulKnowledge; import java.awt.BorderLayout; import java.awt.Cont

一个测试理解什么是主、辅LRU(oracle cuug)

LRU是Buffer Cache池中的重要链表,它的作用我不再详述,已经有很多相关资料.这次主要和大 家讨论下主LRU.辅助LRU的作用. 先来看一个测试. 步1:环境介绍 先来看看Buffer Cache的大小: SQL> show sga Total System Global Area 1073741824 bytes Fixed Size                  1284344 bytes Variable Size             960497416 bytes Da

timer的用法-javax.swing.Timer中的线程是不是守护线程,盼大神指点

问题描述 javax.swing.Timer中的线程是不是守护线程,盼大神指点 这是源代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; class mytime implements ActionListener { Timer time; int n=0; mytime() { time=new Timer(1000,this); time.start(); } public void actionPerf

仅修复改善 iOS7 Beta5或是最后一个测试版本

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   [ 科技讯]8月7日消息,今天凌晨, 苹果公司正式发布iOS7 Beta5,开发者可通过OTA升级或到苹果开发者中心下载.       或许是一周前 刚刚发布了iOS7 Beta4版本,在今天发布的iOS7 Beta5版本中,苹果并未带来令人眼前一亮的 新功能, 而是仅仅进行了多项系统 改善,并修复了已发现的Bug漏洞.     有国外分析师表示,为了使iOS

这是一个测试文章

这只是一个测试文章,目的是为了看下,发送文章的流程如何,以及都有哪些功能