public RoomForm() {

        initManagers();
        initVerifiers();


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

        updateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Room> checkedRooms = getCheckedRooms();

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

        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<String> errors = validateFields(
                        new JTextField[]{numberField, capacityField, priceField},
                        new JLabel[]{numberLabel, capacityLabel, priceLabel}
                );

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

                    Room room = assembleRoomFromInput();
                    String message;
                    if (room.getId() == null) {
                        new CreateRoomWorker(room).execute();
                        message = ResourceBundleProvider.getMessage("room.msg.create.success", room.getNumber());
                    } else {
                        new UpdateActionRoomWorker(room).execute();
                        message = ResourceBundleProvider.getMessage("room.msg.update.success", room.getNumber());
                    }

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

        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<Room> checkedRooms = getCheckedRooms();

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

                int chosenOption = JOptionPane.showConfirmDialog(RoomForm.this, ResourceBundleProvider.getMessage("room.delete.question", checkedRooms.size()), null, JOptionPane.YES_NO_OPTION);
                if (chosenOption == JOptionPane.YES_OPTION) {
                    new DeleteActionRoomWorker(checkedRooms).execute();
                }
            }
        });
        deleteButton.setText(ResourceBundleProvider.getMessage("button.delete"));

        numberLabel.setText(ResourceBundleProvider.getMessage("room.number"));
        capacityLabel.setText(ResourceBundleProvider.getMessage("room.capacity"));
        priceLabel.setText(ResourceBundleProvider.getMessage("room.price"));
        roomTable.setTableHeader(new JTableHeader(new DefaultTableColumnModel()));

        reloadRoomTable();
    }