Java 如何在JTable中使用Resultset中的数据?
我正在做一个学校项目,在将结果集的数据存储到JTable中时遇到了问题。以前我使用过,但现在我想知道是否有一种方法可以在不使用外部类文件的情况下做同样的事情,或者是否更容易使用DButils 数据只来自一个表,需要做的就是数据必须显示在JTable中 我想在这里发布我的代码,但我已经看过了,我能找到的唯一教程是关于如何使用和对象[]填充JTable的教程。我正在使用JDBC创建连接Java 如何在JTable中使用Resultset中的数据?,java,sql,jtable,resultset,Java,Sql,Jtable,Resultset,我正在做一个学校项目,在将结果集的数据存储到JTable中时遇到了问题。以前我使用过,但现在我想知道是否有一种方法可以在不使用外部类文件的情况下做同样的事情,或者是否更容易使用DButils 数据只来自一个表,需要做的就是数据必须显示在JTable中 我想在这里发布我的代码,但我已经看过了,我能找到的唯一教程是关于如何使用和对象[]填充JTable的教程。我正在使用JDBC创建连接 提前感谢。当然有一种方法:迭代结果集,并将找到的内容添加到对象[]数组中,该数组将传递到JTable。2D数组中的
提前感谢。当然有一种方法:迭代
结果集
,并将找到的内容添加到对象[]
数组中,该数组将传递到JTable
。2D数组中的每一行在结果集中都有一行
;这些列是值
您将遇到的问题是,如果不遍历它,您将不知道返回了多少行。这就是为什么将其加载到地图中可能是一个更好的主意
下面是一个示例,演示如何执行此操作。你可以在我对这个问题的回答中找到这种方法(以及更多):
公共静态列表映射(ResultSet rs)抛出SQLException{
列表结果=新建ArrayList();
试一试{
如果(rs!=null){
ResultSetMetaData meta=rs.getMetaData();
int numColumns=meta.getColumnCount();
while(rs.next()){
Map row=newhashmap();
对于(int i=1;i当然有一种方法:迭代ResultSet
并将找到的内容添加到对象[]
数组中,该数组被传递到JTable
。在2D数组中,ResultSet
中的每一行有一行;列是值
您将遇到的问题是,如果不遍历它,您将不知道返回了多少行。这就是为什么将它加载到映射中可能是一个更好的主意
下面是一个示例,演示如何执行此操作。您可以在我对此问题的回答中找到该方法(以及更多):
公共静态列表映射(ResultSet rs)抛出SQLException{
列表结果=新建ArrayList();
试一试{
如果(rs!=null){
ResultSetMetaData meta=rs.getMetaData();
int numColumns=meta.getColumnCount();
while(rs.next()){
Map row=newhashmap();
对于(inti=1;i那么这需要几个步骤
我将解释我的方法,这对非常大的集合很好,但如果你只想显示几行,则有点复杂。但我相信它会帮助你。这种方法将动态加载所需的记录,而不是在手上加载整个集合。它会产生一种拥有整个集合的错觉,但不必等待很长的加载时间
1) 好的,首先,让我们假设我们有一个很好的JFrame,您可以从它开始显示。因此,首先我将添加一个JScrollPane,并在其中添加一个JTable。运行它,确保您有一个很好的窗口,其中滚动条中有一个空的JTable
(二)接下来,您需要一个JTable的数据源。由于JTable是一个非常通用的组件,不是专门为SQL结果集设计的,因此它需要一个实现javax.swing.table.AbstractTableModel的数据源,该数据源与SQL无关。因此,我们现在将创建一个TableModelClass,该类将实现AbstractTableModel,然后我们将添加它当然,诀窍是使用我们的SQL结果集实现所有AbstractTableModel获取数据的方法,这取决于您。下面是我的建议->
3) 由于这将是动态的,我们不需要加载所有的数据,但我们需要一个初始设置来显示一个固定大小,比如说200-300行。因此,我将首先执行SQL并用200-300行的缓冲区大小填充数组。缓存多少将取决于两件事:1它应该足够获取JTable当前显示大小的所有数据,2,它应该足够小,以便在我们滚动并获取后续缓存时,它可以xecutes非常快
4) 现在,让我们开始实现所有AbstractTableModel的接口方法
5) 首先,我们查看初始结果集并报告列数。只需添加一个类变量,设置列数并使用:public int getColumnCount()返回它。这从现在起不会改变
6) 同时查看结果集元数据,在类中创建一个列表变量,并添加元数据中返回的列名。使用此列表返回“getColumnName(int col)”中的列名。当然,col索引是结果集中的列位置
7) 现在让我们做“intgetrowcount()”。在TableModelClass内部保留一个变量以包含行数,并在此方法中返回。提示:暂时不要担心,将其设置为固定的大数字(如65000),这样可以在动态加载记录时滚动。一旦到达末尾,我们将将将该数字设置为实际值,滚动窗格将调整到正确的比例。相信我,它工作正常
8) 现在是有趣的部分。当JTable显示表的第一个“页面”时,当用户滚动时,它将开始调用“getValueAt(int row,int col)”。这将直接映射到我们的对象[],但由于我们只有一个缓存,而不是整个表,当用户向下滚动时,我们将需要获取更多数据。我这样做:
public Object getValueAt( int row, int col )
{
// load failed before, no more trying...
if( loadExceptionOccur || ( row >= visualTableSize ) ) return( "" );
// check if requested row is OUT of cache …
try{
if(
// less than cache lower limit...
( ( row < startRow )
||
// Beyond cache upper limit...
( row >= startRow + tableDataCache.size()) )
// Stop unnecessary loading, because of Jtable readjusting
// its visual table size and redrawing the entire table.
&& !tableRedraw
// yes, get new cache...
){
load( row ); // <- below is code
}
// now we now the row is in cache, so ->
// verify requested cell in cache, or beyond data rows,
if(
// greater than lower limit
( row >= startRow )
&&
// less than upper limit...
( row < ( startRow + tableDataCache.size() ) )
){
tableRedraw = false;
// just get the data from the cache. tableDataCache is just your Object[][] array…
Object cellValue = ( ( recordClass ) tableDataCache.get( row-startRow ) ).getValueAt( col );
return ( cellValue );
}
else{
// just show as blank
return( "" );
}
}
catch( Exception error ){
…
public对象getValueAt(int行,int列)
{
//加载之前失败,不再尝试。。。
if(loadExceptionOccur | |(row>=visualTableSize))返回(“”);
//检查请求的行是否超出缓存…
试试{
如果(
//小于缓存下限。。。
((世界其他地区 public Object getValueAt( int row, int col )
{
// load failed before, no more trying...
if( loadExceptionOccur || ( row >= visualTableSize ) ) return( "" );
// check if requested row is OUT of cache …
try{
if(
// less than cache lower limit...
( ( row < startRow )
||
// Beyond cache upper limit...
( row >= startRow + tableDataCache.size()) )
// Stop unnecessary loading, because of Jtable readjusting
// its visual table size and redrawing the entire table.
&& !tableRedraw
// yes, get new cache...
){
load( row ); // <- below is code
}
// now we now the row is in cache, so ->
// verify requested cell in cache, or beyond data rows,
if(
// greater than lower limit
( row >= startRow )
&&
// less than upper limit...
( row < ( startRow + tableDataCache.size() ) )
){
tableRedraw = false;
// just get the data from the cache. tableDataCache is just your Object[][] array…
Object cellValue = ( ( recordClass ) tableDataCache.get( row-startRow ) ).getValueAt( col );
return ( cellValue );
}
else{
// just show as blank
return( "" );
}
}
catch( Exception error ){
…
public void load( int rowIndex )
throws KExceptionClass
{
// calculate start of new cache, if not enough rows for top half of cache
// then start from 0
int halfCache = cacheSize / 2 ;
int DBStartRow = 0;
if( rowIndex > halfCache ) DBStartRow = rowIndex - halfCache;
//Do query to DB
try{
SQLP.load( DBStartRow, cacheSize ); // <- using jdbc load from DbsartRow as many rows as cacheSize. Some sample SQL paging code below ->
}catch( Exception loadError ){
// if the database fails or something do this, so you don’t get a billion errors for each cell. ->
//set load failed flag, kill window
loadExceptionOccur = true;
visualTableSize = 0;
tableDataCache = new ArrayList< recordClass >();
fireTableDataChanged(); // clear the Jtable
// log error
log.log( this, KMetaUtilsClass.getStackTrace( loadError ) );
// show error message
throw new KExceptionClass( "Could not load table data! " , loadError );
}
//Load rows into the cache list.
//Key field values are in the cache list as the last field in each record.
tableDataCache.clear(); // the Object [][], wrapped in class
while( SQLPreprocessor.nextRowValue() ) {
SQL.fetch( record ); //<- get JDBC rows to table cache
tableDataCache.add( record ); // this uses my library, change to JDBC or what ever you use to access SQL
}
log.log( this, "cacheList size = " + tableDataCache.size());
//---------
if(
// Last requested row number
( DBStartRow + cacheSize ) >
// Last replied row number
( SQLPreprocessor.getloadedStartRowIndex() + SQLPreprocessor.getloadedRowCount() )
){
// It is the end of table.
// The visual table is readjusted accordingly.
visualTableSize = SQLPreprocessor.getloadedStartRowIndex() + SQLPreprocessor.getloadedRowCount();
fireTableDataChanged();
tableRedraw = true;
}
startRow = SQLPreprocessor.getloadedStartRowIndex();
log.log( this, "visualTableSize = " + visualTableSize );
}