测试JTable添加数据

package kanjingcai;

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的一个线程,能很好的解决这个问题
 * 供同样遇到这样问题的人参考。
 */
@SuppressWarnings("serial")
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();
 }
}

转载于:https://www.cnblogs.com/kanjingcai/archive/2009/04/25/1443252.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java Swing中,`JTable` 是一个用于显示二维数据的组件,可以用来创建表格式的用户界面。如果你想将 "初始化", "执行", "期望结果", "实际结果", "测试结果" 设置为表头列并美化表格,你可以按照以下步骤操作: 1. **初始化 (Initialization):** 在 `JTable` 构造或初始化时,你需要创建一个 `DefaultTableModel` 或自定义 `TableModel` 并设置列标题。例如: ```java DefaultTableModel model = new DefaultTableModel( new Object[][] { {"初始化", "", "", "", ""}, {/* 添加更多表头行数据 */} }, // 列数 5); ``` 2. **执行 (Execution):** 这一列可能表示每项操作的过程,你可以选择不包含在这个默认模型里,或者将其作为单独的数据单元。 3. **期望结果 (Expected Result):** 这一行通常用于描述操作完成后的预期状态。 4. **实际结果 (Actual Result):** 记录执行后实际产生的结果,可能与期望结果对比。 5. **测试结果 (Test Result):** 可能是成功/失败的标记,或者详细的测试说明。 6. **美化表格 (Aesthetics):** - 使用 `SwingUtilities` 更新表格样式:调整字体、颜色、边框、背景等。 - 设置列宽和排序:`getColumnIdentifiers()` 方法,`setPreferredScrollableViewportSize()`。 - 使用 `JTableHeader` 控制表头外观,如添加滚动条。 ```java JTable table = new JTable(model); table.getColumnModel().getColumn(0).setHeaderValue("初始化"); // 设置列标题 table.getTableHeader().setReorderingAllowed(false); // 阻止列头拖拽 table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); // 如果需要,使用SwingUtilities.setUI改进外观 SwingUtilities.updateComponentTreeUI(table); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setViewportView(table); // 添加滚动条 // 展示到界面 add(scrollPane); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值