Desarrollo de CRUD en Java Swing y ObjectDB para Departamentos y Personas
Implementación de la Clase Principal y Lógica de Interfaz
private final DepartmentDAO deptDAO = new DepartmentDAO();
private final PersonDAO personDAO = new PersonDAO();
private final DefaultListModel<Department> deptModel = new DefaultListModel<>();
private final DefaultListModel<Person> personModel = new DefaultListModel<>();
private final JList<Department> lstDept = new JList<>(deptModel);
private final JList<Person> lstPerson = new JList<>(personModel);
Constructor y Configuración de la Ventana
// Constructor: monta la interfaz y carga datos
public MainFrame() {
super("CRUD ObjectDB – Departamentos & Personas");
JSplitPane split = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
createDeptPanel(), // construye panel departamentos
createPersonPanel() // construye panel personas
);
split.setDividerLocation(250); // posición de la barra central
add(split, BorderLayout.CENTER);
setSize(650, 400);
setLocationRelativeTo(null); // centra la ventana
setDefaultCloseOperation(EXIT_ON_CLOSE);
// Cuando el usuario selecciona un departamento → cargamos sus personas
lstDept.addListSelectionListener(e -> loadPersons());
// Cargar departamentos al iniciar la app
refreshDepartments();
}
Gestión del Panel de Departamentos
private JPanel createDeptPanel() {
JPanel p = new JPanel(new BorderLayout());
p.setBorder(BorderFactory.createTitledBorder("Departamentos"));
p.add(new JScrollPane(lstDept), BorderLayout.CENTER); // lista con scroll
// Botones inferiores
JPanel btns = new JPanel();
JButton bAdd = new JButton("Añadir");
JButton bEdit = new JButton("Editar");
JButton bDel = new JButton("Borrar");
btns.add(bAdd); btns.add(bEdit); btns.add(bDel);
p.add(btns, BorderLayout.SOUTH);
// Eventos de botones
bAdd.addActionListener(e -> addDepartment());
bEdit.addActionListener(e -> editDepartment());
bDel.addActionListener(e -> deleteDepartment());
return p;
}
Operaciones CRUD para Departamentos
private void addDepartment() {
String name = JOptionPane.showInputDialog(this, "Nombre departamento:");
if (name != null && !name.isBlank()) {
deptDAO.save(new Department(name));
refreshDepartments();
}
}
private void editDepartment() {
Department d = lstDept.getSelectedValue();
if (d == null) return;
String name = JOptionPane.showInputDialog(this, "Nuevo nombre:", d.getName());
if (name != null && !name.isBlank()) {
d.setName(name);
deptDAO.save(d);
refreshDepartments();
}
}
private void deleteDepartment() {
Department d = lstDept.getSelectedValue();
if (d == null) return;
if (!d.getStaff().isEmpty()) {
JOptionPane.showMessageDialog(this,
"No se puede borrar: el departamento tiene personas.");
return;
}
if (JOptionPane.showConfirmDialog(this,
"¿Borrar " + d.getName() + "?") == JOptionPane.OK_OPTION) {
deptDAO.delete(d.getId());
refreshDepartments();
}
}
Operaciones CRUD para Personas
private void addPerson() {
Department d = lstDept.getSelectedValue();
if (d == null) {
JOptionPane.showMessageDialog(this,
"Selecciona un departamento primero");
return;
}
Person p = personDialog(new Person("", 18));
if (p != null) {
d.addPerson(p); // enlaza ambos lados en memoria
personDAO.save(p); // persiste la persona con la FK correcta
loadPersons();
}
}
private void editPerson() {
Person p = lstPerson.getSelectedValue();
if (p == null) return;
Person mod = personDialog(p);
if (mod != null) {
personDAO.save(mod);
loadPersons();
}
}
private void deletePerson() {
Person p = lstPerson.getSelectedValue();
if (p == null) return;
if (JOptionPane.showConfirmDialog(this,
"¿Borrar " + p.getName() + "?") == JOptionPane.OK_OPTION) {
Department d = p.getDepartment();
if (d != null) d.removePerson(p); // quita de la lista en memoria
personDAO.delete(p.getId());
loadPersons();
}
}
Diálogos y Actualización de Datos
private Person personDialog(Person p) {
JTextField tfName = new JTextField(p.getName());
JSpinner spAge = new JSpinner(new SpinnerNumberModel(p.getAge(), 0, 120, 1));
JPanel form = new JPanel(new GridLayout(0, 2, 4, 4));
form.add(new JLabel("Nombre:")); form.add(tfName);
form.add(new JLabel("Edad:")); form.add(spAge);
int ok = JOptionPane.showConfirmDialog(this,
form,
(p.getId() == null ? "Nueva" : "Editar") + " persona",
JOptionPane.OK_CANCEL_OPTION);
if (ok != JOptionPane.OK_OPTION) return null;
p.setName(tfName.getText());
p.setAge((Integer) spAge.getValue());
return p;
}
/
private void refreshDepartments() {
deptModel.clear();
deptDAO.findAll().forEach(deptModel::addElement);
if (!deptModel.isEmpty()) lstDept.setSelectedIndex(0);
}
private void loadPersons() {
personModel.clear();
Department d = lstDept.getSelectedValue();
if (d != null) {
List<Person> list = personDAO.findByDepartment(d.getId());
list.forEach(personModel::addElement);
}
}
}