Fiz um jar auto-executável usando MVC. Preciso de opiniões

5 respostas
Fox_McCloud

Eu fiz esse programinha que é um jar auto-executável, procurei seguir o padrão de desenvolvimento MVC, e fiz a Janela usando o Net Beans, mas coloquei os manipuladores de eventos dentro da classe "Principal" no pacote "controle". Segue o código-fonte das classes e o programa em anexo (com código-fonte). Preciso de opiniões, idéias para refinamentos... está tudo nos conformes? O padrão MVC está correto? A classe "Principal" deve mesmo fazer parte do pacote "controle"?

Grato.

[color=red]Pacote "modelo":[/color]

Classe "GeraCadastros":

package modelo;

public class GeraCadastros {

	public static String geraCPF(){
		String resultado="";
		int i,j,soma,resto;
        	int numeros[]=new int[11];
        
        	for(i=0;i<9;i++)
          		numeros[i]=(int)(Math.random()*10);
          
        	soma=0;
        	for(i=0,j=10;i<9;i++,j--)
          		soma+=j*numeros[i];
        	resto=soma%11;
        	if(resto<2)numeros[9]=0;
        	else numeros[9]=11-resto;
          
        	soma=0;
        	for(i=0,j=11;i<10;i++,j--)
          		soma+=j*numeros[i];
        	resto=soma%11;
        	if(resto<2)numeros[10]=0;
        	else numeros[10]=11-resto;
        
        	for(i=0,j=0;i&lt;numeros.length+3;i++){
          		if(i!=3 && i!=7 && i!=11){
            			resultado+=numeros[j];
            			j++;
          		}
          		if(i==3 || i==7)resultado+='.';
          		if(i==11)resultado+='-';
        	}
		return resultado;
	}
	
	public static String geraCNPJ(){
		String resultado="";
		int i,j,soma,resto;
        	int numeros[]=new int[14];
        
        	for(i=0;i&lt;12;i++)
          		numeros[i]=(int)(Math.random()*10);
          
        	soma=0;
        	for(i=0,j=5;i&lt;12;i++,j--){
          		soma+=j*numeros[i];
          		if(j==2)j=10;
        	}
        	resto=soma%11;
        	if(resto&gt;<2)numeros[12]=0;
        	else numeros[12]=11-resto;
          
        	soma=0;
        	for(i=0,j=6;i<13;i++,j--){
          		soma+=j*numeros[i];
          		if(j==2)j=10;
        	}
        	resto=soma%11;
        	if(resto<2)numeros[13]=0;
        	else numeros[13]=11-resto;
        
        	for(i=0,j=0;i&lt;numeros.length+4;i++){
          		if(i!=2 && i!=6 && i!=10 && i!=15){
            			resultado+=numeros[j];
            			j++;
          		}
          		if(i==2 || i==6)resultado+='.';
          		if(i==10)resultado+='/';
          		if(i==15)resultado+='-';
        	}
		return resultado;
	}
	
}

[color=red]Pacote "visao":[/color]

Classe "Janela":

/*
 * Janela.java
 *
 * Created on 18 de Julho de 2005, 20:26
 */

package visao;

import javax.swing.*;

/**
 *
 * @author  Fox McCloud
 */
public class Janela extends JFrame {
    
    /** Creates new form Janela */
    public Janela() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // &gt;&lt;editor-fold defaultstate="collapsed" desc=" Generated Code "&gt;//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        rotuloCPF = new JLabel();
        rotuloCNPJ = new JLabel();
        caixaCPF = new JTextArea();
        caixaCNPJ = new JTextArea();
        botaoCPF = new JButton();
        botaoCNPJ = new JButton();
        botaoLimpa = new JButton();

        getContentPane().setLayout(new java.awt.GridBagLayout());

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setTitle("gera CPF CNPJ");
        setResizable(false);
        rotuloCPF.setText("CPF");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        getContentPane().add(rotuloCPF, gridBagConstraints);

        rotuloCNPJ.setText("CNPJ");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        getContentPane().add(rotuloCNPJ, gridBagConstraints);

        caixaCPF.setEditable(false);
        caixaCPF.setPreferredSize(new java.awt.Dimension(150, 18));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        getContentPane().add(caixaCPF, gridBagConstraints);

        caixaCNPJ.setEditable(false);
        caixaCNPJ.setPreferredSize(new java.awt.Dimension(150, 18));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        getContentPane().add(caixaCNPJ, gridBagConstraints);

        botaoCPF.setText("Gera CPF");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        getContentPane().add(botaoCPF, gridBagConstraints);

        botaoCNPJ.setText("Gera CNPJ");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 2;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        getContentPane().add(botaoCNPJ, gridBagConstraints);

        botaoLimpa.setText("Limpa");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        getContentPane().add(botaoLimpa, gridBagConstraints);

        pack();
    }
    // &lt;/editor-fold&gt;//GEN-END:initComponents
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Janela().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private JButton botaoCNPJ;
    private JButton botaoCPF;
    private JButton botaoLimpa;
    private JTextArea caixaCNPJ;
    private JTextArea caixaCPF;
    private JLabel rotuloCNPJ;
    private JLabel rotuloCPF;
    // End of variables declaration//GEN-END:variables
    
    public void mostraCPF(String cpf){
    	caixaCPF.setText(cpf);
    }
    
    public void mostraCNPJ(String cnpj){
    	caixaCNPJ.setText(cnpj);
    }
    
    public JButton getBotaoCPF(){
    	return botaoCPF;
    }
    
    public JButton getBotaoCNPJ(){
    	return botaoCNPJ;
    }
    
    public JButton getBotaoLimpa(){
    	return botaoLimpa;
    }
    
}

[color=red]Pacote "controle":[/color]

Classe "Principal" (Main-Class no MANIFEST.MF):

package controle;

import javax.swing.*;
import java.awt.event.*;
import visao.*;
import modelo.*;

public class Principal {
	
	private Janela janela;
	
	public Principal(){
		
		janela=new Janela();
		JButton botaoCPF=janela.getBotaoCPF();
		JButton botaoCNPJ=janela.getBotaoCNPJ();
		JButton botaoLimpa=janela.getBotaoLimpa();
		
		botaoCPF.addMouseListener(new MouseAdapter() {
            		public void mouseClicked(MouseEvent evt) {
                		botaoCPFMouseClicked(evt);
            		}
        	});
		
		botaoCNPJ.addMouseListener(new MouseAdapter() {
            		public void mouseClicked(MouseEvent evt) {
                		botaoCNPJMouseClicked(evt);
            		}
        	});
		
		botaoLimpa.addMouseListener(new MouseAdapter() {
            		public void mouseClicked(MouseEvent evt) {
                		botaoLimpaMouseClicked(evt);
            		}
        	});
		
		janela.pack();
		janela.setVisible(true);
		
	}
	
	private void botaoCPFMouseClicked(MouseEvent evt) {//GEN-FIRST:event_botaoCPFMouseClicked
		janela.mostraCPF(GeraCadastros.geraCPF());
	}//GEN-LAST:event_botaoCPFMouseClicked
	
	private void botaoCNPJMouseClicked(MouseEvent evt) {//GEN-FIRST:event_botaoCNPJMouseClicked
		janela.mostraCNPJ(GeraCadastros.geraCNPJ());
	}//GEN-LAST:event_botaoCNPJMouseClicked
	
	private void botaoLimpaMouseClicked(MouseEvent evt) {//GEN-FIRST:event_botaoLimpaMouseClicked
		janela.mostraCPF("");
		janela.mostraCNPJ("");
	}//GEN-LAST:event_botaoLimpaMouseClicked
	
	public static void main(String args[]){
		Principal principal=new Principal();
	}

}

5 Respostas

Thiago_Senna

humm…

legal…

Bom… MVC em aplicação Swing para mim ainda é um enigma! Já participei de uma renca de tópicos, mas MVC com swing que vi até agora nenhum me agradou!

No entanto sua solução foi bém legal!

No entanto, vc seguiu a idéia de que o controle starta a aplicação principal e controla a mesma! Bom, onde trabalho o pessoal também faz assim, e vejo muitos que gostam de usar este modelo.

Mas o meu desafio pessoal é arranjar uma solução melhor que essa!

Essa tua aplicação até é simples, mas em aplicações complexas o controle muitas vezes deverá influenciar em ações bastante complexas na tela, e daí dali interface pra lá e pra cá pra vc conseguir esta tal interoperabilidade!

Bom, para começar seu exemplo foi bom! Mas a minha opinião é para que vc tente buscar sempre formas melhores!

Abraços!
Thiago Senna

F

Thiago,

Fazendo uma propaganda. Tu ja viu a “nova” versao do JForms que estamos usando o XWork?

]['s

Thiago_Senna

Thiago,

Fazendo uma propaganda. Tu ja viu a “nova” versao do JForms que estamos usando o XWork?

]['s

Opa, E ai Fábio!

Versão nova!!! XWork!!! … cara… essa é vou ter que conferir! :wink: hehe

F

Thiago Senna:

Opa, E ai Fábio!

Versão nova!!! XWork!!! … cara… essa é vou ter que conferir! :wink: hehe

Pois é Thiago.

A migracao comecou faz poucos dias, mas ja ta funcionando com o XWork. Nos nao estavamos fazendo muito barulho pq estamos levando o desenvolvimento da primeira versao junto com um projeto. Ou seja, ja ta indo pra producao. Se quizer ver como ta indo, assina a lista de desenvolvimento no java net.

]['s

Fox_McCloud

Thiago, grato pelas dicas, valeu mesmo.
Eu vou repensar isso de iniciar a aplicação via controller ou criar uma classe Main no MVC. É interessante que mais pessoas se manifestem a esse respeito para nos ajudar a ter uma visão mais ampla a respeito.
Meu próximo projeto, já em andamento (eu diria que em 33% da produção), é fazer um Tetris em Java. Estou usando MVC, caminhando bastante bem, o mais difícil foi pensar em como fazer as detecções de colisão daquelas pecinhas, que não são, obviamente, quadrados. Mas encontrei uma solução e estou dando andamento.
Quando estiver pronto disponibilizo no GUJ.
Abraços,
McCloud
:wink:

Criado 18 de julho de 2005
Ultima resposta 19 de jul. de 2005
Respostas 5
Participantes 3