你好,我想从数据库中填充jtable,我使用了一个stackoverflow上的一个成员为我建议的代码
defaulttablemodel.java文件:
import com.home.user.db.vo.UsersVo;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class DefaultTableModel extends AbstractTableModel{
private String[] columnNames =
{
"FIRST NAME",
"LAST NAME",
"AGE"
}
private List<UsersVo> users;
public DefaultTableModel()
{
users = new ArrayList<UsersVo>();
}
public DefaultTableModel(List<UsersVo> users)
{
this.users = users;
}
@Override
public int getColumnCount()
{
return columnNames.length;
}
@Override
public String getColumnName(int column)
{
return columnNames[column];
}
@Override
public int getRowCount()
{
return users.size();
}
@Override
public Class getColumnClass(int column){
switch (column)
{
case 2: return Date.class;
default: return String.class;
}
}
@Override
public boolean isCellEditable(int row, int column){
switch (column)
{
case 2: return true; // only the birth date is editable
default: return false;
}
}
@Override
public Object getValueAt(int row, int column){
UsersVo users = getUserVo(row);
switch (column)
{
case 0: return users.getFirstName();
case 1: return users.getLastName();
case 2: return users.getAge();
;
default: return null;
}
}
@Override
public void setValueAt(Object value, int row, int column){
UsersVo users = getUserVo(row);
switch (column)
{
case 0: users.setFirstName((String)value); break;
case 1: users.setLastName((String)value); break;
case 2: users.setAge((Date)value); break;
}
fireTableCellUpdated(row, column);
}
public UsersVo getUserVo(int row){
return users.get( row );
}
public void addUserVo(UsersVo user){
insertUsersVo(getRowCount(), user);
}
public void insertUsersVo(int row, UsersVo user){
users.add(row, user);
fireTableRowsInserted(row, row);
}
}
这是usersvo.java:
public class UsersVo {
private String firstName;
private String lastName;
private Date age;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getAge() {
return birthdate;
}
public void setAge(Date age) {
this.birthdate = birthdate;
}
这是从数据库usersdb.java获取数据的实现方法:
private Object usersModel;
@Override
public UsersVo getData(UsersVo uv) throws Exception {
Connection con = null;
UsersVo userVo = null;
ResultSet rs = null;
PreparedStatement ps = null;
try{
con = getConnection();
String sql = "SELECT * FROM USERS";
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
userVo = new UsersVo();
userVo.setFirstName(rs.getString("FIRST_NAME"));
userVo.setLastName(rs.getString("LAST_NAME"));
userVo.setBirthDate(rs.getDate("BIRTH_DATE"));
usersModel.addUserVo(userVo);
}
}catch(Exception ex){
JOptionPane.showMessageDialog(null,ex.getMessage());
}finally{
rs.close();
ps.close();
closeConnection(con);
}
return userVo;
}
我只得到表中的列名,没有数据库中的数据,请问问题出在哪里?
1条答案
按热度按时间iovurdzv1#
我只获取表中的列名,而没有数据库中的数据
这是因为您只创建具有列名而没有数据的模型。您需要为结果集中的每一行数据向模型中添加一行数据。
不要调用您的类defaulttablemodel。jdk已经有一个使用该名称的类。defaulttablemodel将向量对象添加到模型中。我们为您提供了一个链接,指向如何在没有任何自定义代码的情况下使用现有defaulttablemodel的工作示例。
但是,您已经决定创建一个自定义
TableModel
为您的习惯UserVo
对象。因此,模型的逻辑名称是UserVoTableModel
.创建
UserVoTableModel
这只是第一步。现在需要向模型中添加数据。因此,在while循环中,当处理数据库中的每一行数据时,需要如下逻辑:
所以你还需要更新你的
UserVoTableModel
包括addUserVo(...)
方法。如何创建addUserVo(...)
方法在上一个问题中给出的链接中得到了演示:如何从数据库填充jtable?编辑:
你知道如何从数据库中读取数据吗?连接到数据库的代码看起来不完整。您是否向while循环中添加了system.out.println(…)语句以显示结果集中返回的值。这是你需要下决心的第一步。
阅读关于jdbc数据库访问的教程,了解使用sql的基础知识。
我提供了一个链接,指向一个将数据从数据库加载到jtable的工作示例。链接是:https://stackoverflow.com/a/55635012/131872
因此,从工作代码开始,定制它以访问您的数据库。一旦您访问数据库并返回结果集中的数据,我提供的代码将在没有任何自定义类的情况下工作。defaulttablemodel将使用一个向量来表示数据库中的一行数据。
您只需自定义数据库的连接逻辑。我不能告诉你怎么做,因为我不知道你的数据库是什么。哈
一旦通用代码正常工作,就可以尝试自定义它以使用自定义对象。为此,您需要:
用自定义uservotablemodel替换defaulttablemodel
用自定义uservol替换向量。