很多朋友在开发数据列表中数据新增、修改等操作的时候一般是弹出一个新的表单来处理,其实可以像类似Excel和很多数据库工具那样直接双击单元格来编辑的,例如时间字段默认显示时间,双击后弹出时间框来选择;部门的字段可以默认显示部门,双击后弹出一个ComboBox选项等等。
简单写一个例子,供大家参考。 // 设置jTableUser模型
jTableUser.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] { },
new String [] {
"编号", "姓名", "所属公司", "密码", "管理权限", "锁定标识", "操作员", "操作时间", "备注"
}
) {
boolean[] canEdit = new boolean [] {
false, true, true, true, true, true, false, false, true // 设置字段是否可编辑
}; public boolean isCellEditable(int rowIndex, int columnIndex) {
if(rowIndex == jTableUser.getRowCount() - 1) { // 亮点~一般新增一条数据我们可以默认在数据最后一行加一个空行,这句就是判断这个空行的各个字段要都可以编辑,例如编号。
return true;
} else {
return canEdit [columnIndex];
}
}
}); // 设置特殊字段编辑器
TableColumnModel TCMUser = jTableUser.getColumnModel(); // jTableUser为用户管理的列表 jComboBoxDept.setFont(new java.awt.Font("SimSun", 0, 12)); // jComboBoxDept为部门下来选框
jComboBoxDept.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
int index = jComboBoxDept.getSelectedIndex();
// 根据数据控件为单元格赋值
if (index != -1 && jTableUser.getSelectedRow() != -1 && jTableUser.getSelectedColumn() != -1 && deptList.size() >= index + 1) {
jTableUser.setValueAt(deptList.get(index).getID(), jTableUser.getSelectedRow(), jTableUser.getSelectedColumn());
}
}
});
DefaultCellEditor DCEDept = new DefaultCellEditor(jComboBoxDept) {
public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
return ((MouseEvent) anEvent).getClickCount() >= 2; // 双击时编辑单元格
}
return true;
}
};
TCMUser.getColumn(2).setCellEditor(DCEDept); // 第三列为使用部门下拉选框的字段 // 保存用户(包含新增) 对数据库的操作隐藏了,自行根据需要增加
private void jButtonUserSaveActionPerformed(java.awt.event.ActionEvent evt) {
int index = jTableUser.getSelectedRow(); DefaultTableModel DTM = (DefaultTableModel) jTableUser.getModel();
DTM.setValueAt(config.getUser().getID(), index, 6);
DTM.setValueAt(Util.getNowStr(), index, 7);
Vector vector = DTM.getDataVector();
boolean isOK = true;
if (index == jTableUser.getRowCount() - 1) {
String ID = String.valueOf(DTM.getValueAt(index, 0));
for (int i = 0; i < vector.size() - 1; i++) {
String id = String.valueOf(((Vector) vector.get(i)).get(0));
if (ID.equalsIgnoreCase(id)) {
JOptionPane.showMessageDialog(this, "编号重复,请更换!", "错误", JOptionPane.ERROR_MESSAGE);
isOK = false;
break;
}
}
}
if (isOK) {
Vector datas = (Vector) vector.get(index);
setSelectedUser(datas);
if (selectedUser != null) {
userList.add(selectedUser);
if (index == jTableUser.getRowCount() - 1) {
Object[] ob = {};
DTM.addRow(ob); // 增加空行,为下次新增数据做准备
}
JOptionPane.showMessageDialog(this, "用户数据保存成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, "请填写完整数据!", "错误", JOptionPane.ERROR_MESSAGE);
}
}
} // 删除用户 对数据库的操作隐藏了,自行根据需要增加
private void jButtonUserDelActionPerformed(java.awt.event.ActionEvent evt) {
if (selectedUser != null) { // selectedUser为单击所选行后封装的User对象
if (JOptionPane.showConfirmDialog(this, "是否确认删除用户:" + selectedUser.getName(), "确认", JOptionPane.YES_NO_OPTION) == 0) {
((DefaultTableModel) jTableUser.getModel()).removeRow(jTableUser.getSelectedRow());
}
}
}JTable表格编辑器
简单写一个例子,供大家参考。 // 设置jTableUser模型
jTableUser.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] { },
new String [] {
"编号", "姓名", "所属公司", "密码", "管理权限", "锁定标识", "操作员", "操作时间", "备注"
}
) {
boolean[] canEdit = new boolean [] {
false, true, true, true, true, true, false, false, true // 设置字段是否可编辑
}; public boolean isCellEditable(int rowIndex, int columnIndex) {
if(rowIndex == jTableUser.getRowCount() - 1) { // 亮点~一般新增一条数据我们可以默认在数据最后一行加一个空行,这句就是判断这个空行的各个字段要都可以编辑,例如编号。
return true;
} else {
return canEdit [columnIndex];
}
}
}); // 设置特殊字段编辑器
TableColumnModel TCMUser = jTableUser.getColumnModel(); // jTableUser为用户管理的列表 jComboBoxDept.setFont(new java.awt.Font("SimSun", 0, 12)); // jComboBoxDept为部门下来选框
jComboBoxDept.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
int index = jComboBoxDept.getSelectedIndex();
// 根据数据控件为单元格赋值
if (index != -1 && jTableUser.getSelectedRow() != -1 && jTableUser.getSelectedColumn() != -1 && deptList.size() >= index + 1) {
jTableUser.setValueAt(deptList.get(index).getID(), jTableUser.getSelectedRow(), jTableUser.getSelectedColumn());
}
}
});
DefaultCellEditor DCEDept = new DefaultCellEditor(jComboBoxDept) {
public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
return ((MouseEvent) anEvent).getClickCount() >= 2; // 双击时编辑单元格
}
return true;
}
};
TCMUser.getColumn(2).setCellEditor(DCEDept); // 第三列为使用部门下拉选框的字段 // 保存用户(包含新增) 对数据库的操作隐藏了,自行根据需要增加
private void jButtonUserSaveActionPerformed(java.awt.event.ActionEvent evt) {
int index = jTableUser.getSelectedRow(); DefaultTableModel DTM = (DefaultTableModel) jTableUser.getModel();
DTM.setValueAt(config.getUser().getID(), index, 6);
DTM.setValueAt(Util.getNowStr(), index, 7);
Vector vector = DTM.getDataVector();
boolean isOK = true;
if (index == jTableUser.getRowCount() - 1) {
String ID = String.valueOf(DTM.getValueAt(index, 0));
for (int i = 0; i < vector.size() - 1; i++) {
String id = String.valueOf(((Vector) vector.get(i)).get(0));
if (ID.equalsIgnoreCase(id)) {
JOptionPane.showMessageDialog(this, "编号重复,请更换!", "错误", JOptionPane.ERROR_MESSAGE);
isOK = false;
break;
}
}
}
if (isOK) {
Vector datas = (Vector) vector.get(index);
setSelectedUser(datas);
if (selectedUser != null) {
userList.add(selectedUser);
if (index == jTableUser.getRowCount() - 1) {
Object[] ob = {};
DTM.addRow(ob); // 增加空行,为下次新增数据做准备
}
JOptionPane.showMessageDialog(this, "用户数据保存成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, "请填写完整数据!", "错误", JOptionPane.ERROR_MESSAGE);
}
}
} // 删除用户 对数据库的操作隐藏了,自行根据需要增加
private void jButtonUserDelActionPerformed(java.awt.event.ActionEvent evt) {
if (selectedUser != null) { // selectedUser为单击所选行后封装的User对象
if (JOptionPane.showConfirmDialog(this, "是否确认删除用户:" + selectedUser.getName(), "确认", JOptionPane.YES_NO_OPTION) == 0) {
((DefaultTableModel) jTableUser.getModel()).removeRow(jTableUser.getSelectedRow());
}
}
}JTable表格编辑器
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货