如何将从 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()));
问题是DBUtils
returns一个完整的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 );
}
我的 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
.当
[时默认renderer使用复选框=36=]getColumnClass()
returnsBoolean.class
forRow.checked
.在对应的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()));
问题是DBUtils
returns一个完整的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 );
}