很多朋友在开发数据列表中数据新增、修改等操作的时候一般是弹出一个新的表单来处理,其实可以像类似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表格编辑器