我想显示一个JTable,它按原样显示DataBase表中的数据。
到目前为止,我已经使用了JTable来显示来自Object [] []的数据。
我知道显示数据的一种方法是首先将数据库表转换为Object [] []但是还有其他任何容易但更强大和灵活的方法。
答案 0 :(得分:24)
我建议采取以下方法:
Row
类来表示从ResultSet
读取的行。这可能是Object[]
。List<Row>
集合,并为此集合支持子类AbstractTableModel
。SwingWorker
填充您的List<Row>
,方法是阅读后台主题上的基础ResultSet
(即doInBackground()
方法内) 。调用SwingWorker
的{{1}}方法将publish
发布回Event Dispatch主题(例如,每100行)。Row
的{{1}}方法并读取最新的行数时,将其添加到SwingWorker
并触发相应的process
以显示更新。List<Row>
确定TableEvent
定义中每列的ResultSetMetaData
。这将使它们正确呈现(如果您只是使用2D Class
数组,情况就不会这样了。)这种方法的优点是在处理大型TableModel
时UI不会锁定,并且显示将在处理结果时以递增方式更新。
修改强>
在下面添加了示例代码:
Object[][]
答案 1 :(得分:7)
在JTable中显示数据库数据的另一种强大而灵活的方法是将查询的结果数据加载到CachedRowSet,然后使用JTable适配器将其连接到TableModel。
George Reese的这个book为他的班级 RowSetModel 提供the source code以使RowSet适应作为TableModel。为我工作开箱即用。我唯一的改变是该类的更好名称: RowSetTableModel 。
RowSet是ResultSet的子接口,在Java 1.4中添加。所以RowSet 是一个ResultSet。
CachedRowSet实现为您完成工作,而不是创建Row类,Row对象列表和ResultSetMetaData,如本页其他答案中所述。
Sun / Oracle提供了reference implementation的CachedRowSet。其他供应商或JDBC驱动程序也可以提供实现。
答案 2 :(得分:4)
根据您已经完成的工作以及您愿意做的事情,我已经非常成功地使用Netbeans及其Beans Binding支持数据库驱动的应用程序。将JTable绑定到数据库,它会自动构建JPA查询。
答案 3 :(得分:4)
使用ResultSet填充jTable的最佳方法
1)结果集“rs”填充了您需要的数据。 2)JTable“jTable1”是在手工创建的 3)表头是在手前实现的
java.sql.ResultSet rs = datacn.executeSelectQuery(query);
//Filling JTable with Result set
// Removing Previous Data
while (jTable1.getRowCount() > 0) {
((DefaultTableModel) jTable1.getModel()).removeRow(0);
}
//Creating Object []rowData for jTable's Table Model
int columns = rs.getMetaData().getColumnCount();
while (rs.next())
{
Object[] row = new Object[columns];
for (int i = 1; i <= columns; i++)
{
row[i - 1] = rs.getObject(i); // 1
}
((DefaultTableModel) jTable1.getModel()).insertRow(rs.getRow() - 1,row);
}
答案 4 :(得分:3)
您必须创建自定义TableModel您可以在此处指定数据的来源和方式。
首先,您必须完全了解JTable + TableModel的工作原理,然后按照之前发布的答案之一进行操作。
答案 5 :(得分:1)
我知道这个问题很老但是对于任何遵循Adamski解决方案的人来说,在gui和ResultSet
线程之间共享ResultSetMetadata
和SwingWorker
时应该小心。在SQLite中使用这种方法时,我得到了一个不一致的内部状态异常。解决方案是在执行SwingWorker
之前将任何元数据加载到私有字段,并使用getter函数(getColumnName等)来返回字段。
答案 6 :(得分:0)
我在JTable中为显示数据库表数据提供了一个小方法。您只需要将数据库表的结果集作为参数传递。
// rs is the ResultSet of the Database table
public void displayData(ResultSet rs)
{
//jt Represents JTable
//jf represents JFrame
int i;
int count;
String a[];
String header[] = {"1","2","3","4","5"}; //Table Header Values, change, as your wish
count = header.length;
//First set the Table header
for(i = 0; i < count; i++)
{
model.addColumn(header[i]);
}
jt.setModel(model); //Represents table Model
jf.add(jt.getTableHeader(),BorderLayout.NORTH);
a = new String[count];
// Adding Database table Data in the JTable
try
{
while (rs.next())
{
for(i = 0; i < count; i++)
{
a[i] = rs.getString(i+1);
}
model.addRow(a); //Adding the row in table model
jt.setModel(model); // set the model in jtable
}
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, "Exception : "+e, "Error", JOptionPane.ERROR_MESSAGE);
}
}