Refatoração de código - CONTROLLER e FORM (swing)

2 respostas
A

Me ajudem a corrigir a estrutura das classes PesTipoemailController e PesTipoemailFORM, de modos que:
Tenho uma classe persistente:

class PesTipoemail implements Serializable{
   private Long id, 
   private String dsTipoemail;
   //gets e sets 
}

Tenho a seguinte TableModel:

class PesTipoEmailTableModel extends AbstractTableModel{
     //implementação padrao
     //com construtor sem parametros e outro que recebe uma List<PesTipoemail>

     //métodos mais relevantes
    public void addLista(List<PesTipoemail> tipoemails) {
		int tamanhoAntigo = getRowCount();
		rows.addAll(tipoemails);
		fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
	}

	public void limpar() {
		rows.clear();
		fireTableDataChanged();
	}
}

Tenho o seguinte JDialog que é o meu formulário de inserção o qual possui apenas um campo para descrição do TIPO de EMAIL, a JTable que lista os já existentes, e um painelActions que contém os botões para CRUD:

class PesTipoemailFORM extends MyJACadastros {

    private PesTipoemail tipoemail;
    private PesTipoEmailTableModel tableModel;

    public PesTipoemailFORM() {
        super();
        initConteudo();
        ndsfDSTipoemail.requestFocus();
        pack();
    }

    public JButton getGravarButton() {
        return panelAcoes.btGravar;
    }

    public JButton getLimparButton() {
        return panelAcoes.btLimpar;
    }
    public JButton getExcluirButton(){
        return panelAcoes.btExcluir;
    }
    public void initConteudo() {
        labelDSTipoemal = new JLabel("Tipo Email:");
        ndsfDSTipoemail = new JTextField();

        table = new JTable();
        definirModelo();
        initColumnSizes(table);
        table.getTableHeader().setReorderingAllowed(false);
        table.getTableHeader().setResizingAllowed(false);
        table.setAutoCreateRowSorter(true);

        //adiciona conteúdo do painel principal
        panelConteudo.add(labelDSTipoemal, "");
        panelConteudo.add(ndsfDSTipoemail, "gapright 2,growx, pushx, wrap");
        panelConteudo.add(new JScrollPane(table), "spanx, growx,hmax 300");
    }
    public void registraTableMouseListener(MouseListener listener){
        table.addMouseListener(listener);
    }
    private void definirModelo() {
        tableModel = new PesTipoEmailTableModel();
        table.setModel(tableModel);
        table.setDefaultRenderer(Object.class, new MyCellRendererWithAlignment());
    }
    public  void exibirListaNaTabela(List<PesTipoemail> list) {
        tableModel.addLista(list);
    }
    public void limparTabela(){
        tableModel.limpar();
    }
    public  Long getIdSelecionado() {
        if (table.getSelectedRow() > -1) {
            Long id = new Long(tableModel.getValueAt(table.getSelectedRow(), 0).toString());
            return id;
        }
        return null;
    }
    public void resetForm() {
        ndsfDSTipoemail.setText("");
        ndsfDSTipoemail.requestFocus();
    }

    private void mostrarDados(PesTipoemail m) {
        ndsfDSTipoemail.setText(m.getDsTipoemail());
        ndsfDSTipoemail.requestFocus();
    }

    private PesTipoemail obtemDados() {
        if (tipoemail == null) {
            tipoemail = new PesTipoemail();
        }

        tipoemail.setDsTipoemail(ndsfDSTipoemail.getText());
        return tipoemail;
    }

    public PesTipoemail getTipoemail() {
        obtemDados();
        return tipoemail;
    }

    public void setTipoemail(PesTipoemail tipoemail) {
        this.tipoemail = tipoemail;
        mostrarDados(tipoemail);
    }


    private void initColumnSizes(JTable table) {
        table.getColumnModel().getColumn(0).setMaxWidth(80);
    }
}

E o seguinte controlador:

class PesTipoemailController{
    
    private PesTipoemailDAO dao;
    private final PesTipoemailFORM form;
    private final SimpleDateFormat df;
    private PesTipoemail tipoemail;
    private List<PesTipoemail> listaTipoemail;

    public PesTipoemailController() {
        this.dao = new PesTipoemailDAOImpl();
        this.form = new PesTipoemailFORM();
        this.df = new SimpleDateFormat("dd/MM/yyyy");
        this.tipoemail = null;
        this.listaTipoemail = null;
        implementaActionButtons();
    }
    public PesTipoemailController(PesTipoemailDAO dao) {
        this();
        this.dao = dao;
    }
    public static void main(String[] args) {
        new PesTipoemailController().showUI();
    }
    /*
    CONTROLE
    */
    public void implementaActionButtons(){
        form.getGravarButton().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                gravar(form.getTipoemail());
                listaTipoemail = listarTodos();
                form.resetForm();
                form.setTipoemail(novo());
                form.limparTabela();
                form.exibirListaNaTabela(listaTipoemail);
            }
        });
        form.getLimparButton().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                form.setTipoemail(novo());
            }
        });
        form.getExcluirButton().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                excluir(form.getTipoemail());
                listaTipoemail = listarTodos();
                form.resetForm();
                form.setTipoemail(novo());
                form.limparTabela();
                form.exibirListaNaTabela(listaTipoemail);
            }
        });
    }
    public void showUI(){
        form.exibirListaNaTabela(listarTodos());
        form.registraTableMouseListener(new MouseListener() {

            public void mouseClicked(MouseEvent e) {
                if(e.getClickCount() == 2){
                    form.setTipoemail(buscarPorId(form.getIdSelecionado()));
                }
            }

            public void mousePressed(MouseEvent e) {
            }

            public void mouseReleased(MouseEvent e) {
            }

            public void mouseEntered(MouseEvent e) {
            }

            public void mouseExited(MouseEvent e) {
            }
        });
        form.setVisible(true);
    }
    public PesTipoemail novo() {
        tipoemail = new PesTipoemail();
        return tipoemail;
    }
    /*
    CRUD
    */
    public boolean gravar(PesTipoemail tipoemail){
        try{
            if(tipoemail.getId() == null){
                dao.save(tipoemail);
            }else{
                dao.update(tipoemail);
            }
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
        listaTipoemail = null;
        return true;
    }
    
    public boolean excluir(PesTipoemail tipoemail){
        try{
            dao.delete(tipoemail);
        }catch(Exception e){
            return false;
        }
        listaTipoemail = null;
        return true;
    }
    public PesTipoemail buscarPorId(Long id){
        return dao.find(id);
    }
    public List<PesTipoemail> listarTodos(){
        if(listaTipoemail == null){
            listaTipoemail = dao.findAll();
        }
        return listaTipoemail;
    }

    public PesTipoemail getTipoemail() {
        return tipoemail;
    }

    public void setTipoemail(PesTipoemail tipoemail) {
        this.tipoemail = tipoemail;
    }

 
    
    
}

Questões:
1 - Quanto aos eventos, eu estou tratando eles no lugar certo? Por exemplo: o evento do usuário clicar 2 vezes em uma linha da tabela, está certo capturar no controller e da maneira que está na linha 59?

2 - A ação de gravar: da linha 28 até a linha 38 no controller, está gerenciando todo o fluxo, isso está no lugar correto?

3 - Na linha 46 do FORM eu seto um cellrenderer. Está sendo feito corretamente?

4 - Na linha 29 do FORM eu chamo um método que está no final da classe para alterar largura da primeira coluna “Código”. Está correto?

Aceito qualquer tipo de crítica em relação à qualquer método ou estrutura das classes aqui dispostas, bem como do meu Post caso esteja incompreensivo.

2 Respostas

ViniGodoy

As linhas que você descreve não estão batendo com o código que você postou. Mas não é usual criar uma classe inteira para o Controller ao programar em Swing. Seu professor está exigindo o uso de MVC completo, ou seria possível usar o MVC simplificado, da forma que o Swing recomenda?

A

Mas, conferi aqui e pra mim as linhas estão corretas :$, e como assim não criar uma Classe inteira para o Controller?, e quanto ao MVC, pode ser de qualquer forma, de modos que seja de fácil manutenção, entendimento e reutilização de código.

Obrigado pela resposta!!

Criado 4 de fevereiro de 2014
Ultima resposta 10 de fev. de 2014
Respostas 2
Participantes 2