如何将从 MySQL 数据库检索到的每一行动态添加 JCheckBox 到 JTable

How to add JCheckBox dynamically to each row retrieved from MySQL database to JTable

我的 JTable 上有来自数据库的数据。我想从数据库动态地向每一行添加复选框。稍后我将使用这些复选框删除从数据库中选中的行。我知道如何从数据库中删除,但如何从数据库中添加复选框?任何人之前做过这件事请帮助。我是一个 Java 的爱好者,正在努力学习它。示例代码可以帮助我了解如何执行此操作。

下面的代码用于更新我的 JTable:

public void UpdateTable() {

    try {

        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/"
                + "employee_certificate", "root", "");

        String sql = "SELECT certificate.Number, staff.Emp_Id, staff.Emp_Name, "
                + "staff.Department,  certificate.Cert_Code, certificate.Cert_Name,\n"
                + "certificate.Vendor, certificate.Date_Taken, "
                + "certificate.Expiry_Date FROM staff LEFT JOIN certificate"
                + " ON staff.Emp_Id=certificate.Emp_Id ORDER BY staff.Emp_Name\n";

        PreparedStatement pstmt = con.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        jTable1.setModel(DbUtils.resultSetToTableModel(rs));
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    }
}

从这个完整的 开始,我进行了以下更改以获得以下结果。特别是,

  • Row 被赋予属性 Boolean checked,替换 String name.

  • getColumnClass() returns Boolean.class for Row.checked.

    [时默认renderer使用复选框=36=]
  • 在对应的JDBC和SQL中,checked属性的类型是boolean.

$ diff Original.java WorkerTest.java 
48c48
<         String name;
---
>         Boolean checked;
91c91
<                     return row.name;
---
>                     return row.checked;
105a106,116
>         @Override
>         public Class<?> getColumnClass(int colIndex) {
>             switch (colIndex) {
>                 case 0:
>                     return Integer.class;
>                 case 1:
>                     return Boolean.class;
>             }
>             return null;
>         }
> 
114c125
<                         r.name = rs.getString(2);
---
>                         r.checked = rs.getBoolean(2);
138c149
<             st.execute("create table city(id integer, name varchar2)");
---
>             st.execute("create table city(id integer, checked boolean)");
143,144c154
<                 ps.setString(2, (char) ('A' + r.nextInt(26))
<                     + String.valueOf(r.nextInt(1_000_000)));
---
>                 ps.setBoolean(2, Boolean.valueOf(r.nextBoolean()));

问题是DBUtilsreturns一个完整的TableModel

最简单的方法是不使用 DBUtils 并自己将数据从 ResultSet 加载到 TableModel

代码并不难,您可以从 Table From Database 中找到的 Table From Database Example 作为起点。

该代码只是将 ResultSet 中的数据加载到 Vectors 中,因此您可以手动添加另一列以包含布尔数据。

对代码的(两个)更改类似于:

//  Get column names

for (int i = 1; i <= columns; i++)
{
    columnNames.addElement( md.getColumnName(i) );
}

columnName.addElement( "Check Mark" ); // added

//  Get row data

while (rs.next())
{
    Vector<Object> row = new Vector<Object>(columns);

    for (int i = 1; i <= columns; i++)
    {
        row.addElement( rs.getObject(i) );
    }

    row.addElement( Boolean.FALSE ); // added
    data.addElement( row );
}