数据不显示在jtable中

3lxsmp7m  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(427)

你好,我想从数据库中填充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;
}

我只得到表中的列名,没有数据库中的数据,请问问题出在哪里?

iovurdzv

iovurdzv1#

我只获取表中的列名,而没有数据库中的数据
这是因为您只创建具有列名而没有数据的模型。您需要为结果集中的每一行数据向模型中添加一行数据。
不要调用您的类defaulttablemodel。jdk已经有一个使用该名称的类。defaulttablemodel将向量对象添加到模型中。我们为您提供了一个链接,指向如何在没有任何自定义代码的情况下使用现有defaulttablemodel的工作示例。
但是,您已经决定创建一个自定义 TableModel 为您的习惯 UserVo 对象。因此,模型的逻辑名称是 UserVoTableModel .
创建 UserVoTableModel 这只是第一步。现在需要向模型中添加数据。
因此,在while循环中,当处理数据库中的每一行数据时,需要如下逻辑:

userVo = new UsersVo();
userVo.setFirstName(rs.getString("FIRST_NAME"));
userVo.setLastName(rs.getString("LAST_NAME"));
userVo.setBirthDate(rs.getDate("BIRTH_DATE"));
userVoModel.addUserVo( userVo );

所以你还需要更新你的 UserVoTableModel 包括 addUserVo(...) 方法。如何创建 addUserVo(...) 方法在上一个问题中给出的链接中得到了演示:如何从数据库填充jtable?
编辑:
你知道如何从数据库中读取数据吗?连接到数据库的代码看起来不完整。您是否向while循环中添加了system.out.println(…)语句以显示结果集中返回的值。这是你需要下决心的第一步。
阅读关于jdbc数据库访问的教程,了解使用sql的基础知识。
我提供了一个链接,指向一个将数据从数据库加载到jtable的工作示例。链接是:https://stackoverflow.com/a/55635012/131872
因此,从工作代码开始,定制它以访问您的数据库。一旦您访问数据库并返回结果集中的数据,我提供的代码将在没有任何自定义类的情况下工作。defaulttablemodel将使用一个向量来表示数据库中的一行数据。
您只需自定义数据库的连接逻辑。我不能告诉你怎么做,因为我不知道你的数据库是什么。哈
一旦通用代码正常工作,就可以尝试自定义它以使用自定义对象。为此,您需要:
用自定义uservotablemodel替换defaulttablemodel
用自定义uservol替换向量。

相关问题