【发布时间】:2021-10-07 10:04:09
【问题描述】:
我可以从数据库中获取数据并将其存储在JTable 中。一切正常,但如果我编辑表格中的数据并按回车键,数据不会编辑。
更改后表中的值不会被覆盖。
构造函数和getter/setter
public class employee {
private Integer emp_code;
private String f_name;
private String l_name;
private Integer age;
private String birth;
private String nationality;
private String gender;
private String contact;
private String contact2;
private String address;
private Integer gov_id;
private String passport_no;
private String profile;
public employee(Integer emp_code, String f_name, String l_name, Integer age, String birth, String nationality, String gender, String contact, String contact2, String address, Integer gov_id, String passport_no, String profile) {
this.emp_code = emp_code;
this.f_name = f_name;
this.l_name = l_name;
this.age = age;
this.birth = birth;
this.nationality = nationality;
this.gender = gender;
this.contact = contact;
this.contact2 = contact2;
this.address = address;
this.gov_id = gov_id;
this.passport_no = passport_no;
this.profile = profile;
}
// getter setter
}
模特
public class TheModel extends AbstractTableModel {
private String[] columns;
private Object[][] rows;
private boolean[] edit;
public TheModel() {
}
public TheModel(Object[][] data, String[] columnName, boolean[] canEdit) {
this.rows = data;
this.columns = columnName;
this.edit = canEdit;
}
public Class getColumnClass(int column) {
if (column == 12) {
return Icon.class;
} else {
return getValueAt(0, column).getClass();
}
}
public int getRowCount() {
return this.rows.length;
}
public int getColumnCount() {
return this.columns.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return this.rows[rowIndex][columnIndex];
}
public String getColumnName(int col) {
return this.columns[col];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return edit[columnIndex];
}
}
Java SWING 文件
private void btnSearchActionPerformed(java.awt.event.ActionEvent evt) {
getEmployee();
}
public void getEmployee() {
ArrayList<employee> list = getTable();
String[] columnName = {"Code", "f_name", "l_name", "Age", "Birth", "Nationality", "Gender", "Contact", "Contact2", "Address", "Gov. id", "Passport no", "Profile"};
boolean[] canEdit = new boolean[]{
false, false, false, false, false, false, false, false, false, false, false, false, false
};
Object[][] rows = new Object[list.size()][13];
for (int i = 0; i < list.size(); i++) {
rows[i][0] = list.get(i).getEmp_code();
rows[i][1] = list.get(i).getF_name();
rows[i][2] = list.get(i).getL_name();
rows[i][3] = list.get(i).getAge();
rows[i][4] = list.get(i).getBirth();
rows[i][5] = list.get(i).getNationality();
rows[i][6] = list.get(i).getGender();
rows[i][7] = list.get(i).getContact();
rows[i][8] = list.get(i).getContact2();
rows[i][9] = list.get(i).getAddress();
rows[i][10] = list.get(i).getGov_id();
rows[i][11] = list.get(i).getPassport_no();
if (list.get(i).getProfile() != "") {
ImageIcon MyImage = new ImageIcon(new ImageIcon(list.get(i).getProfile()).getImage()
.getScaledInstance(70, 50, Image.SCALE_SMOOTH));
rows[i][12] = MyImage;
} else {
rows[i][12] = null;
}
}
TheModel model = new TheModel(rows, columnName, canEdit);
model.fireTableDataChanged();
jTable1.setModel(model);
jTable1.setRowHeight(50);
jTable1.getColumnModel().getColumn(12).setPreferredWidth(70);
}
public ArrayList<employee> getTable() {
ArrayList<employee> list = new ArrayList<employee>();
PreparedStatement pst;
ResultSet r;
try {
Connection cn = null;
Class.forName("com.mysql.jdbc.Driver");
cn = DriverManager.getConnection("jdbc:mysql://localhost/car_inventory_system", "root", "");
pst = cn.prepareStatement("SELECT * FROM employee_registration_master WHERE f_name = ? OR l_name = ?");
pst.setString(1, txtSearch.getText());
pst.setString(2, txtSearch.getText());
r = pst.executeQuery();
employee e;
while (r.next()) {
e = new employee(
r.getInt("emp_code"),
r.getString("f_name"),
r.getString("l_name"),
r.getInt("age"),
r.getString("birth"),
r.getString("nationality"),
r.getString("gender"),
r.getString("contact"),
r.getString("contact2"),
r.getString("address"),
r.getInt("gov_id"),
r.getString("passport_no"),
r.getString("profile")
);
list.add(e);
}
pst.close();
cn.close();
} catch (Exception e) {
System.out.println(e);
}
return list;
}
这是在编辑值之前。这里l_name 是Dourcy 我把它改成Leach:
这是在编辑值之后。这里下来l_name是不是改成Leach:
【问题讨论】:
-
我的直接想法是,你没有实现
TableModel#setValueAt -
但是我直接通过
ArrayList<>推送数据 -
单元格编辑器将通知表格单元格编辑已停止。该表将从编辑器获取值并通过
setValueAt方法将该值传递给TableModel。然后,您需要更新基础数据 -
我建议从How to Use Tables阅读关于Editors and Renders的部分
-
@MadProgrammer 我把它改成
setValueAt但错误是void type allowed here见上面我的问题...