Onde fica o controller em uma aplicação java desktop?

Estou usando o padrão MVC em uma aplicação desktop e gostaria de saber onde a camada do controller se aplicaria. pelo que sei o controller é responsável por ligar o model e a view. Ele pega os dados da view e manda pro model. Tentei implementar em uma aplicação desktop mas não sei se está correto. Eu codifico os dados da view no controller e chamo o controller na view para gerenciar os dados. Mandarei um pequeno exemplo abaixo. Alguém poderia informar se fiz correto ?

Camada controller

public class PacienteController {`

    private TelaPaciente view;


    public PacienteController(TelaPaciente view) {
        this.view = view;
   
    }

    public void salvar() {
            Paciente paciente = new Paciente();
            Endereco endereco = new Endereco();

            paciente.setNome(this.view.getTfNome().getText());
            paciente.setIdade(Integer.parseInt(this.view.getTfIdade().getText()));
            paciente.setCpf(this.view.getTfCpf().getText());
            if (this.view.getrFeminino().isSelected()) {
                paciente.setSexo(this.view.getrFeminino().getText());
            } else {
                paciente.setSexo(this.view.getrMasculino().getText());
            }

            endereco.setUf(this.view.getCbEstado().getSelectedItem().toString());
            endereco.setBairro(this.view.getTfBairro().getText());
            endereco.setCep(this.view.getTfCep().getText());
            endereco.setCidade(this.view.getCbCidade().getSelectedItem().toString());
            endereco.setNumero(Integer.parseInt(this.view.getTfNumero().getText()));

            endereco.setRua(this.view.getTfRua().getText());
            paciente.setEndereco(endereco);

            repositorio.salvarPaciente(paciente, "salvar");

        }

Camada view

private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                          
       
this.controller.salvar()

}

Achei que essa abordagem que vc fez ficou bacana. Vc criou uma dependência da view com a controller e vice-e-versa neh.

1 curtida

Isso mesmo. Eu fiz o gerenciamento dos dados da view na camada controller e na camada da view eu apenas chamo o controller para realizar o gerenciamento. Minha dúvida era se minha lógica em relação ao controller estava correta. Como vc achou legal, acredito que esteja tudo ok. Obrigado por responder!

1 curtida

Por curiosidade, vc poderia mandar o código das classes View e a Controller (dessa view) pra gente dá uma olhada?

Posso sim. Se tiver algo errado ou estranho pode me avisar. Estou aqui para aprender.

Controller

public class PacienteController implements GenericInterfaceController {

    private TelaPaciente view;


    public PacienteController(TelaPaciente view) {
        this.view = view;
   
    }

    @Override
    public void atualizarTabela() {

        PacienteDAO repositorio = new PacienteDAO();

        ArrayList<Paciente> pacientes = repositorio.listarTodos();

        DefaultTableModel modelo = new DefaultTableModel();

        modelo.addColumn("ID");
        modelo.addColumn("Nome");
        modelo.addColumn("Idade");
        modelo.addColumn("CPF");
        modelo.addColumn("Sexo");
        modelo.addColumn("UF");
        modelo.addColumn("CEP");
        modelo.addColumn("Cidade");
        modelo.addColumn("Bairro");
        modelo.addColumn("Rua");
        modelo.addColumn("Número");

        for (Paciente paciente : pacientes) {
            modelo.addRow(new Object[]{
                paciente.getId(),
                paciente.getNome(),
                paciente.getIdade(),
                paciente.getCpf(),
                paciente.getSexo(),
                paciente.getEndereco().getUf(),
                paciente.getEndereco().getCep(),
                paciente.getEndereco().getCidade(),
                paciente.getEndereco().getBairro(),
                paciente.getEndereco().getRua(),
                paciente.getEndereco().getNumero(),});

            this.view.getTabelaPaciente().setModel(modelo);

        }

    }

    @Override
    public void salvar() {
        Paciente paciente = new Paciente();
        Endereco endereco = new Endereco();

        PacienteModel validar = new PacienteModel();

        paciente.setNome(this.view.getTfNome().getText());
        paciente.setIdade(Integer.parseInt(this.view.getTfIdade().getText()));
        paciente.setCpf(this.view.getTfCpf().getText());
        if (this.view.getrFeminino().isSelected()) {
            paciente.setSexo(this.view.getrFeminino().getText());
        } else {
            paciente.setSexo(this.view.getrMasculino().getText());
        }

        endereco.setUf(this.view.getCbEstado().getSelectedItem().toString());
        endereco.setBairro(this.view.getTfBairro().getText());
        endereco.setCep(this.view.getTfCep().getText());
        endereco.setCidade(this.view.getCbCidade().getSelectedItem().toString());
        endereco.setNumero(Integer.parseInt(this.view.getTfNumero().getText()));

        endereco.setRua(this.view.getTfRua().getText());
        paciente.setEndereco(endereco);

        validar.validarPaciente(paciente, "salvar");

    }

    @Override
    public void editar() {
        Paciente paciente = new Paciente();
        Endereco endereco = new Endereco();

        PacienteModel validar = new PacienteModel();

        int codigo = Integer.parseInt(String.valueOf(this.view.getTabelaPaciente().
                getValueAt(this.view.getTabelaPaciente().getSelectedRow(), 0)));

        paciente.setId(codigo);

        paciente.setNome(this.view.getTfNome().getText());
        paciente.setIdade(Integer.parseInt(this.view.getTfIdade().getText()));
        paciente.setCpf(this.view.getTfCpf().getText());
        if (this.view.getrFeminino().isSelected()) {
            paciente.setSexo(this.view.getrFeminino().getText());
        } else {
            paciente.setSexo(this.view.getrMasculino().getText());
        }

        endereco.setUf(this.view.getCbEstado().getSelectedItem().toString());
        endereco.setBairro(this.view.getTfBairro().getText());
        endereco.setCep(this.view.getTfCep().getText());
        endereco.setCidade(this.view.getCbCidade().getSelectedItem().toString());
        endereco.setNumero(Integer.parseInt(this.view.getTfNumero().getText()));

        endereco.setRua(this.view.getTfRua().getText());
        paciente.setEndereco(endereco);

        validar.validarPaciente(paciente, "alterar");

    }

    @Override
    public void bloquearCampos(boolean bloquear) {
        this.view.getTfNome().setEnabled(!bloquear);
        this.view.getTfBairro().setEnabled(!bloquear);
        this.view.getrMasculino().setEnabled(!bloquear);
        this.view.getrFeminino().setEnabled(!bloquear);
        this.view.getTfCep().setEnabled(!bloquear);
        this.view.getTfCpf().setEnabled(!bloquear);
        this.view.getTfIdade().setEnabled(!bloquear);
        this.view.getTfNumero().setEnabled(!bloquear);
        this.view.getTfRua().setEnabled(!bloquear);
        this.view.getCbCidade().setEnabled(!bloquear);
        this.view.getCbEstado().setEnabled(!bloquear);

    }

    @Override
    public void limparCampos() {
        this.view.getTfNome().setText("");
        this.view.getTfBairro().setText("");
        this.view.getTfCep().setText("");
        this.view.getTfCpf().setText("");
        this.view.getTfIdade().setText("");
        this.view.getTfNumero().setText("");
        this.view.getTfRua().setText("");
        this.view.getrFeminino().setSelected(false);
        this.view.getrMasculino().setSelected(false);
        this.view.getCbCidade().removeAllItems();
    }

    
    }

    @Override
    public void btnAlterar() {

        try {
            this.view.setFuncao("alterar");
           
            PacienteDAO repositorio = new PacienteDAO();
            int linha = this.view.getTabelaPaciente().getSelectedRow();
            long codigo = Long.parseLong(String.valueOf(this.view.getTabelaPaciente().getValueAt(linha, 0)));
           Paciente pacienteEncontrado = repositorio.listarPorId(codigo);

            if (pacienteEncontrado == null) {
                bloquearCampos(true);
            } else {
                bloquearCampos(false);
            }

            this.view.getTfNome().setText(pacienteEncontrado.getNome());
            this.view.getTfCpf().setText(pacienteEncontrado.getCpf());
            this.view.getTfCpf().setEnabled(false);
            this.view.getTfIdade().setText(String.valueOf(pacienteEncontrado.getIdade()));
            this.view.getTfCep().setText(pacienteEncontrado.getEndereco().getCep());
            this.view.getTfRua().setText(pacienteEncontrado.getEndereco().getRua());
            this.view.getTfBairro().setText(pacienteEncontrado.getEndereco().getBairro());
            this.view.getTfNumero().setText(String.valueOf(pacienteEncontrado.getEndereco().getNumero()));
            this.view.getCbEstado().setSelectedItem(pacienteEncontrado.getEndereco().getUf());
            this.view.getCbCidade().setSelectedItem(pacienteEncontrado.getEndereco().getCidade());

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Escolha um paciente para editar!");

        }
    }

    @Override
    public void btnExcluir() {
    
         try {
            PacienteDAO repositorio = new PacienteDAO();

            int linha = this.view.getTabelaPaciente().getSelectedRow();
            long codigo = Long.parseLong(String.valueOf(this.view.getTabelaPaciente().getValueAt(linha, 0)));

            Paciente paciente = repositorio.listarPorId(codigo);

            switch (JOptionPane.showConfirmDialog(null, " Tem certeza que deseja excluir ? ", "Confirmar exclusão", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)) {

                case 0:

                    repositorio.excluir(paciente);
                    

                    break;

                case 1:
                    break;
            }

        } catch (Exception e) {

            JOptionPane.showMessageDialog(null, "Escolha um paciente para excluir!");

        }

View

    public class TelaPaciente extends javax.swing.JInternalFrame {

        private String funcao;
        private PacienteController controller;

        /**
         * Creates new form TelaPaciente
         */
        public TelaPaciente() {
            initComponents();
            controller = new PacienteController(this);
            this.controller.bloquearCampos(true);
            this.controller.atualizarTabela();

        }

    private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {                                           
            // TODO add your handling code here:
            this.controller.btnExcluir();
            this.controller.atualizarTabela();
        }                                          

        private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                          
            // TODO add your handling code here

            if (this.funcao.equals("salvar")) {
                this.controller.salvar();
                this.controller.atualizarTabela();
                this.controller.bloquearCampos(true);

            } else if (this.funcao.equals("alterar")) {
                this.controller.editar();
                this.controller.atualizarTabela();
                this.controller.bloquearCampos(true);

            }      

        }   
    private void btnCancelarPesquisaActionPerformed(java.awt.event.ActionEvent evt) {                                                    
            // TODO add your handling code here:

            this.controller.atualizarTabela();
        }                                                   

        private void btnEditarActionPerformed(java.awt.event.ActionEvent evt) {                                          
            // TODO add your handling code here:
            this.controller.btnAlterar();

        }                                         

        private void btnNovoActionPerformed(java.awt.event.ActionEvent evt) {                                        
            // TODO add your handling code here:
            this.controller.limparCampos();
            this.controller.bloquearCampos(false);
            this.funcao = "salvar";

        }                                       

        private void btnLimparActionPerformed(java.awt.event.ActionEvent evt) {                                          
            // TODO add your handling code here:

            this.controller.limparCampos();
        }

Essa ideia está muito boa pra mim. A separação deixou a responsabilidade bem definida. Uma observação que tenho é (e não tem nada a ver com a view e a controller) vc não usar DefaultTableModel. Prefira criar sua propria model herdando de AbstractTableModel.

1 curtida