public PersonForm() {

        initManagers();
        initVerifiers();


        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                clearAllFields();
                if (currentlyUpdatedPersonId != null) {
                    new LoadPersonWorker(currentlyUpdatedPersonId).execute();
                }
            }
        });
        cancelButton.setText(ResourceBundleProvider.getMessage("button.cancel"));

        updateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Person> checkedPeople = getCheckedPeople();

                if (checkedPeople.isEmpty()) {
                    JOptionPane.showMessageDialog(PersonForm.this, ResourceBundleProvider.getMessage("error.noselected"));
                } else if (checkedPeople.size() > 1) {
                    JOptionPane.showMessageDialog(PersonForm.this, ResourceBundleProvider.getMessage("error.moreselected"));
                } else {
                    setFieldValues(checkedPeople.get(0));
                }
            }
        });
        updateButton.setText(ResourceBundleProvider.getMessage("button.update"));

        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<String> errors = validateFields(
                        new JTextField[]{nameField, phoneField, addressField},
                        new JLabel[]{nameLabel, phoneLabel, addressLabel}
                );

                if (!errors.isEmpty()) {
                    JOptionPane.showMessageDialog(PersonForm.this, StringUtils.printDelimited(errors, "\n"));
                } else {

                    Person person = assemblePersonFromInput();
                    String message;
                    if (person.getId() == null) {
                        new CreatePersonWorker(person).execute();
                        message = ResourceBundleProvider.getMessage("person.msg.create.success", person.getName());
                    } else {
                        new UpdateActionPersonWorker(person).execute();
                        message = ResourceBundleProvider.getMessage("person.msg.update.success", person.getName());
                    }

                    JOptionPane.showMessageDialog(PersonForm.this, message);
                }
            }
        });
        okButton.setText(ResourceBundleProvider.getMessage("button.ok"));

        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Person> checkedPeople = getCheckedPeople();

                if (checkedPeople.isEmpty()) {
                    JOptionPane.showMessageDialog(PersonForm.this, ResourceBundleProvider.getMessage("error.noselected"));
                    return;
                }

                int chosenOption = JOptionPane.showConfirmDialog(PersonForm.this, ResourceBundleProvider.getMessage("person.delete.question", checkedPeople.size()), null, JOptionPane.YES_NO_OPTION);
                if (chosenOption == JOptionPane.YES_OPTION) {
                    new DeleteActionPersonWorker(checkedPeople).execute();
                }
            }
        });
        deleteButton.setText(ResourceBundleProvider.getMessage("button.delete"));

        nameLabel.setText(ResourceBundleProvider.getMessage("person.name"));
        addressLabel.setText(ResourceBundleProvider.getMessage("person.address"));
        phoneLabel.setText(ResourceBundleProvider.getMessage("person.phone"));
        personTable.setTableHeader(new JTableHeader(new DefaultTableColumnModel()));

        reloadPersonTable();
    }