博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java JTable刷新问题
阅读量:3587 次
发布时间:2019-05-20

本文共 3277 字,大约阅读时间需要 10 分钟。

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());
    
}
  
}
}

转载地址:http://ymswn.baihongyu.com/

你可能感兴趣的文章
IDEA修改文件后出现星号
查看>>
设计模式——单例模式
查看>>
工厂模式
查看>>
ClassUtils——可以由一个接口查找到所有的实现类,也可 以由父类查找到所有的子类
查看>>
责任链模式
查看>>
算法(1)——流程图和DNS图
查看>>
leetcode——442
查看>>
sentinel 控制台讲解-流控规则--阈值类型:QPS 流控模式:直接 流控效果:快速失败
查看>>
Java语言程序设计(基础篇)第十版 5.3-6
查看>>
Java语言程序设计(基础篇)第十版 5.7
查看>>
Java语言程序设计(基础篇)第十版 5.8 5.9
查看>>
Java语言程序设计(基础篇)第十版 5.10-11
查看>>
Java语言程序设计(基础篇)第十版 5.12-13
查看>>
Java语言程序设计(基础篇)第十版 5.14
查看>>
Java语言程序设计(基础篇)第十版 5.15-16
查看>>
java语言程序设计 第十版(基础篇)5.22
查看>>
java语言程序设计 第十版(基础篇)5.23-26
查看>>
java语言程序设计 第十版(基础篇)6.3-4
查看>>
Oracle_001_怎么安装virtualbox虚拟机运行xp环境、oracle简介、virtualbox、VMWare
查看>>
FPGA之DDS信号发生器
查看>>