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、付费专栏及课程。

余额充值