java JTable刷新问题

import java.util.LinkedList;

import java.util.List;

import javax.swing.SwingUtilities;

import javax.swing.table.AbstractTableModel;

 

 

/**

 *

 * @date   17/10/2012

 */

public class SizeFixedStackTableModel<R> extends AbstractTableModel {

   

  public static interface RecordRenderer<R> {

     

    int getColumnCount();

     

    /**

     

     * @param record

     * @param column

     * @return 

     * @throws IndexOutOfBoundsException when column is not valid 

     *         {@code ( column < 0 || column >= getColumnCount() )}

     */

    Object getValueAt(R record, int column);

  }

   

  private final RecordRenderer<? super R> recordRenderer;

  private volatile int size;

  private List<R> records;

   

  public SizeFixedStackTableModel(RecordRenderer<? super R> recordRenderer,

                              int size) {

     

    if( recordRenderer == null )

      throw new NullPointerException();

     

    if( size < 0 )

      throw new IllegalArgumentException();

     

    this.recordRenderer = recordRenderer;

    this.size = size;

     

    this.records = new LinkedList<R>();

  }

   

  @Override

  public int getRowCount() {

     

    assert SwingUtilities.isEventDispatchThread();

     

    return Math.min(size, records.size());

  }

 

  @Override

  public int getColumnCount() {

     

    assert SwingUtilities.isEventDispatchThread();

     

    return recordRenderer.getColumnCount();

  }

 

  @Override

  public Object getValueAt(int rowIndex, int columnIndex) {

     

    assert SwingUtilities.isEventDispatchThread();

     

    // potentially throws IndexOutOfBoundsException

    R record = records.get(rowIndex); 

    return recordRenderer.getValueAt(record, columnIndex);

  }

   

  public void setSize(int size) {

     

    if( size < 0 )

      throw new IllegalArgumentException("Invalid table model size: " + size);

     

    ifthis.size == size )

      return;

     

    this.size = size;

    fireTableDataChanged();

  }

   

  public void insert(final R record) {

     

    if( SwingUtilities.isEventDispatchThread() ) {

       

      records.add(0, record);

      fireTableDataChanged();

    }

    else {

       

      SwingUtilities.invokeLater(new Runnable() {

 

        @Override

        public void run() {

           

          insert(record);

        }

      });

    }

  }

}


import java.awt.BorderLayout;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
 
 
/**
 *
 * @date   17/10/2012
 */
public class TestTable {
   
  public static void main(String[] args) throws Exception {
     
    final int rows = 30;
     
    final SizeFixedStackTableModel<Date> model = 
            new SizeFixedStackTableModel<Date>(
            new SizeFixedStackTableModel.RecordRenderer<Date>() {
               
      private final DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS");
       
      @Override
      public int getColumnCount() {
         
        return 2;
      }
 
      @Override
      public Object getValueAt(Date record, int column) {
         
        if( column == 0 )
          return format.format(record);
        else if( column == 1 )
          return record.getTime();
        else
          throw new IndexOutOfBoundsException("Invalid column : " + column);
      }
    }, rows);
     
    final CountDownLatch cd = new CountDownLatch(1);
     
    SwingUtilities.invokeLater(new Runnable() {
 
      @Override
      public void run() {
         
        JFrame f = new JFrame("Test Table Model");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
        JTable table = new JTable(model);
        f.getContentPane().add(table, BorderLayout.CENTER);
        f.setSize(800, table.getRowHeight() * rows + 50);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        cd.countDown();
      }
    });
     
    cd.await();
     
    while(true) {
       
      Thread.sleep(500);
      model.insert(new Date());
    }
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值