Passagem de parâmetros

8 respostas
M

Boa noite,

Estou fazendo um projeto pra faculdade utilizando o windowBuilder e precisava de uma ajuda.

No projeto, tem a classe pessoa e a classe controle. Criei uma tela pra cadastrar o usuário e quando clicam em salvar ele faz a validação dos dados e cria um obj usuário, queria que ele enviasse esse obj pra classe controle, que possui um array de usuários, pois vou precisar acessar/modificar esse array em outras view’s.

Não sei como faço pra enviar/puxar esse array do Controle. Havia instanciado como static, mas soube que não posso usar essa variável static como se fosse global.

public class Usuario extends Endereco{

private String nome;
private String cpf;
private String cnh;
private List<Veiculo> veiculos;
private String senha;
private Veiculo selectedVeiculo;


public Usuario( ) {
	super();

}

// + get’s / set’s

public class Controle {

private List estacionamento;

private List usuarios;

private Date date = new Date();

private Usuario loggedUser;

// + get’s / set’s

O problema é que se tento criar um “new Controle()”, ele zera o array.

Atenciosamente,
Miguel Kuckoski.

8 Respostas

Francisco_Chaves

Olá amigo, você poderia salvar os usuários em algum banco de dados e quando fosse utilizar acessariam.

staroski

Quais são as classes envolvidas e como elas se relacionam?

Sim, a intrução new tem esse nome justamente porque ela instancia um novo objeto da classe. No seu caso você não precisa de um novo objeto, tem que usar o mesmo que já foi instanciado.

Quando instanciar essa tela, passa a instância de Controle como parâmetro pra ela, modifica o construtor de forma que só seja possível criar a tela passando um objeto do tipo Controle.

Um usuário não é um endereço, então qual o motivo da classe Usuario estender a classe Endereco?

M

Sim, mas no meu curso ainda não houve essa introdução ao banco de dados, então não seria avaliado por isso. Acho que acabaria sendo um trabalho desnecessário.

M

Na verdade, a herança de endereço foi apenas pra utilizarmos o conceito, agregando na nota.

No caso, ficaria assim:

index:
Controle controle = new Controle();

private JButton getBtnCadastrar() {
	if (btnCadastrar == null) {
		btnCadastrar = new JButton("Cadastrar");
		btnCadastrar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				frame.setVisible(false);
				Cadastro.cadastro(controle);
			}
		});
	}
	return btnCadastrar;
}

cadastro:
private Controle controle;

public static void cadastro(Controle controle) {		
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});

}

e iria passando essa instancia de controle como argumento por todo o programa ?
Só mais uma coisa, ali no cadastro, tentei dar um “this.controle = controle”, pra poder usar a variável nos outros métodos, mas ele anuncia um erro. Como posso fazer?

staroski

Então, como mencionei, já está errado pois um usuário não é um endereço. :wink:

Se você não falar as classes que você tem e como elas se relacionam, fica difícil te orientar.
Os códigos parciais não ajudaram.

Porque a classe Cadastro tem um método estático chamado cadastro?

Sugiro que você monte uma estrutura mais ou menos assim:

public class Programa {

    // única instância do programa
    public static final Programa INSTANCIA = new Programa();

    // ponto de entrada para executar o programa
    public static void main(String[] params) {
        INSTANCIA.executar();
    }

    private Tela1 tela1;
    private Tela1 tela2;
    private Tela1 tela3;

    private final Controle controle;

    // construtor privado
    private Programa() {
        // o controle só é instanciado uma vez, ao iniciar o programa
        controle = new Controle();
    }

    // aqui começa a execução do prorama
    private void executar() {
        // esse programa aqui simplesmente apresenta a Tela1
        Tela1 tela = getTela1();
        tela.setVisible(true);
    }

    public Tela1 getTela1() {
        if (tela1 == null) {
            // o construtor da Tela1 espera receber uma instância de Controle
            tela1 = new Tela1(controle);
        }
        return tela1;
    }

    public Tela1 getTela2() {
        if (tela2 == null) {
            // o construtor da Tela2 espera receber uma instância de Controle
            tela2 = new Tela2(controle);
        }
        return tela2;
    }

    public Tela3 getTela3() {
        if (tela3 == null) {
            // o construtor da Tela3 espera receber uma instância de Controle
            tela3 = new Tela3(controle);
        }
        return tela3;
    }
}
M

Então, o método cadastro seria o main dela, pra inicializar a janela.

vou enviar as classes mais completas pra você analisar.

public class Index {

private JFrame frame;
private JLabel lblCpf;
private JFormattedTextField cpfField;
private JLabel lblPassword;
private JPasswordField passwordField;
private JButton btnSair;
private JButton btnLogin;
private JButton btnCadastrar;
protected static final Index window = new Index();
private Controle controle;

/**
 * Launch the application.
 * 
 */

public static void main(String[] args) {
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				window.frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

/**
 * Create the application.
 * 
 * @wbp.parser.entryPoint
 */

private void initialize() {…}

/// sets and gets dos componentes

private JButton getBtnLogin() {
	if (btnLogin == null) {
		btnLogin = new JButton("Login");
		btnLogin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				login();
			}
		});
	}
	return btnLogin;
}

private JButton getBtnCadastrar() {
	if (btnCadastrar == null) {
		btnCadastrar = new JButton("Cadastrar");
		btnCadastrar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				// Torna a view index invisivel e inicializa a tela de cadastro.
				frame.setVisible(false);
				Cadastro.cadastro(getControle());

			}
		});
	}
	return btnCadastrar;
}

public void login() {
	// Verifica os dados de login com a lista de usuarios cadastrados.
	String cpf = getTextFieldCpf().getText();
	char[] senhaChar = getPasswordField().getPassword();
	String senha = new String(senhaChar);		
	
	for (Usuario usuario : getControle().getUsuarios()) {
		//Comparando os campos digitados com os usuários cadastrados.
		if (usuario.getSenha().equals(senha) && usuario.getCpf().equals(cpf)) {
			getControle().setLoggedUser(usuario);
			break;
		}
	}

	if (getControle().getLoggedUser() != null) {
		boolean estacionado = false;
		for (Veiculo veiculo : getControle().getLoggedUser().getVeiculos()) {
			if (veiculo.isEstacionado()) {
				getControle().getLoggedUser().setSelectedVeiculo(veiculo);
				estacionado = true;
				break;
			}
		}	
		
		//Verifica qual sera a proxima tela.
		if (estacionado) {
			LogadoEstacionado.logadoEstacionado(getControle());
		} else {
			LogadoNaoEstacionado.logadoNaoEstacionado(getControle());
		}
		
		// torna a tela index invisivel.
		frame.setVisible(false);

	} else {
		JOptionPane.showMessageDialog(null, "Usuario não cadastrado.", "Erro de login!",
				JOptionPane.WARNING_MESSAGE);
	}
}

public Controle getControle() {
	if(controle == null)
		controle = new Controle();
	return controle;
}

// A partir do btnCadastrar ou btnLogin, ele chama torna o index invisivel e chama a proxima classe, passando o controle instanciado como parametro.

public class Cadastro extends JFrame implements Iview {

private JPanel contentPane;

private JLabel lblDadosPessoais;

private JLabel lblNome;

private JTextField textFieldNome;

private JLabel lblCpf;

private JFormattedTextField textFieldCpf;

private JLabel lblCnh;

private JFormattedTextField textFieldCnh;

private JLabel lblEndereo;

private JLabel lblRua;

private JLabel lblComplemento;

private JLabel lblCep;

private JLabel lblBairro;

private JTable table;

private JLabel lblCidade;

private JLabel lblEstado;

private JTextField textFieldRua;

private JTextField textFieldComplemento;

private JFormattedTextField textFieldNumero;

private JFormattedTextField textFieldCep;

private JTextField textFieldBairro;

private JTextField textFieldCidade;

private JComboBox comboBoxEstado;

private JButton btnCadastrar;

private JButton btnVoltar;

private JButton btnVeiculos;

protected final static Cadastro frame = new Cadastro();

private JLabel lblN;

private JLabel lblSenha;

private JPopupMenu popUpCadastroVeiculo;

private JPasswordField textFieldSenha;

private static Controle controle;
/**
 * Launch the application.
 * 
 * @param controle2
 */
public static void cadastro(Controle controle) {
	EventQueue.invokeLater(new Runnable() {
		
		public void run() {
			try {
				setControle(controle);
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});

}

/**
 * Create the frame.
 */

public Cadastro() {…}

/// + get’s e set’s

public static Controle getControle() {
	return controle;
}

public static void setControle(Controle controle) {
	if(Cadastro.controle == null) 
		Cadastro.controle = controle;
}

private JButton getBtnCadastrar() {
	if (btnCadastrar == null) {
		btnCadastrar = new JButton("Cadastrar");
		btnCadastrar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				save();
				cleanValues();
			}
		});
	}
	return btnCadastrar;
}

public void save() {
	String validacao = validateValues();

	// verifica se houve algum erro na validação.
	if (validacao == null) {
		assignValues(); // cria o objeto usuario.
		cleanValues();
		String[] args = null;
		
		frame.setVisible(false); // set tela cadastro invisivel.
		Index.main(args); // Retorna pro metodo index.

		JOptionPane.showMessageDialog(null, "Cadastro realizado com sucesso!", "WARNING",
				JOptionPane.WARNING_MESSAGE);

	} else {
		JOptionPane.showMessageDialog(null, "Preencha todos os campos: \n " + validacao, "WARNING",
				JOptionPane.WARNING_MESSAGE);
	}

}


public void assignValues() {
	
	// Cria o objeto conforme os campos informados pelo usuário na tela.
	
	
	Usuario usuario = new Usuario();
	usuario.setNome(getTextFieldNome().getText());
	char[] senhaChar = getTextFieldSenha().getPassword();
	String senha = new String(senhaChar);
	usuario.setSenha(senha);
	usuario.setCpf(getTextFieldCpf().getText());
	// usuario.setCnh(getTextFieldCnh().getText());
	// usuario.setRua(getTextFieldRua().getText());
	// usuario.setNum(Integer.parseInt(getTextFieldNumero().getText()));
	// usuario.setBairro(getTextFieldBairro().getText());

	usuario.setEstado(getComboBoxEstado().getName());

	if (getTextFieldComplemento().getText().length() > 0) {
		usuario.setComplemento(getTextFieldComplemento().getText());
	}
	if (getTextFieldCidade().getText().length() > 0) {
		usuario.setCidade(getTextFieldCidade().getText());
	}

	usuario.setVeiculos(CadastroVeiculo.getVeiculos());
	
	getControle().addUsuarios(usuario); // aqui seria onde eu passaria o obj usuário pra classe controle, onde contem esse array.
}

// classe controle.

public class Controle {

private List estacionamento;

private List usuarios;

private Date date = new Date();

private Usuario loggedUser;
public List<Estacionamento> getEstacionamento() {
	return estacionamento;
}

public void setEstacionamento(Estacionamento estacionamento) {
	this.estacionamento.add(estacionamento);
}

public List<Usuario> getUsuarios() {
	if(usuarios == null) {
		usuarios = new ArrayList<Usuario>();
	}
	return usuarios;
}

public void addUsuarios(Usuario usuario) {
	if(usuarios == null) {
		usuarios = new ArrayList<Usuario>();
	}
	this.usuarios.add(usuario);
}	

public void removeUsuario(Usuario usuario) {
	this.usuarios.remove(usuario);
}	

public Date getDate() {
	return date;
}

public void setDate(Date date) {
	this.date = date;
}

public void criarUsuario() {
	
}

public void removerUsuario() {
	
}

public void escreverLog() {
	
}

public void lerLog() {
	
}

public Usuario getLoggedUser() {
	return loggedUser;
}

public void setLoggedUser(Usuario loggedUser) {
	this.loggedUser = loggedUser;
}

}

Desculpa se estiver insistindo no erro, realmente sou novato com o windowBuilder. Nessa sugestão que você deu, caso eu deva seguir, como faria pra alternar entre as telas?

staroski

O WindowBuilder é só um plugin para desenhar telas e você só o deveria utilizar para este propósito.
Desenhe suas telas com ele e depois programe normalmente.
Talvez falta você dar uma estudada nos conceitos básicos de programação orientada à objetos.

Crie um projetinho novo com as classes do exemplo abaixo para entender como funciona.
Depois é só substituir as classes Tela1, Tela2 e Tela3, pelas telas que você desenhou com o WindowBuilder, simples assim.

Código fonte da classe Controle (você vai usar sua implementação):

public class Controle {

    // implementação da sua classe controle
}

Código fonte da classe que tem o método main:

public class Programa {

    // única instância do programa
    public static final Programa INSTANCIA = new Programa();

    // ponto de entrada para executar o programa
    public static void main(String[] params) {
        INSTANCIA.executar();
    }

    private Tela1 tela1; // Tela1 é uma outra classe que foi criada com WindowBuilder
    private Tela2 tela2; // Tela2 é uma outra classe que foi criada com WindowBuilder
    private Tela3 tela3; // Tela3 é uma outra classe que foi criada com WindowBuilder

    private final Controle controle;

    // construtor privado
    private Programa() {
        // o controle só é instanciado uma vez, ao iniciar o programa
        controle = new Controle();
    }

    // aqui começa a execução do prorama
    private void executar() {
        // esse programa aqui simplesmente apresenta a Tela1
        Tela1 tela = getTela1();
        tela.setVisible(true);
    }

    public Tela1 getTela1() {
        if (tela1 == null) {
            // o construtor da Tela1 espera receber uma instância de Controle
            tela1 = new Tela1(controle);
        }
        return tela1;
    }

    public Tela2 getTela2() {
        if (tela2 == null) {
            // o construtor da Tela2 espera receber uma instância de Controle
            tela2 = new Tela2(controle);
        }
        return tela2;
    }

    public Tela3 getTela3() {
        if (tela3 == null) {
            // o construtor da Tela3 espera receber uma instância de Controle
            tela3 = new Tela3(controle);
        }
        return tela3;
    }
}

Código fonte da Tela 1:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Tela1 extends JFrame {

    private final Controle controle;

    // construtor que espera receber um objeto Controle como parâmetro
    Tela1(Controle controle) {
        super("Tela 1");
        this.controle = controle;
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                sair();
            }
        });
        setSize(640, 480);

        JButton buttonAbrirTela2 = new JButton("Abrir Tela 2");
        buttonAbrirTela2.addActionListener(event -> abrirTela2());

        JButton buttonAbrirTela3 = new JButton("Abrir Tela 3");
        buttonAbrirTela3.addActionListener(event -> abrirTela3());

        JPanel panelBotoes = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panelBotoes.add(buttonAbrirTela2);
        panelBotoes.add(buttonAbrirTela3);

        Container container = getContentPane();
        container.add(panelBotoes, BorderLayout.SOUTH);
    }

    private void abrirTela2() {
        Programa programa = Programa.INSTANCIA;
        Tela2 tela2 = programa.getTela2();
        tela2.setVisible(true);
        tela2.requestFocus();
    }

    private void abrirTela3() {
        Programa programa = Programa.INSTANCIA;
        Tela3 tela3 = programa.getTela3();
        tela3.setVisible(true);
        tela3.requestFocus();
    }

    private void sair() {
        Tela1 parent = this;
        String message = "Deseja realmente sair?";
        String title = "ATENÇÃO";
        int optionType = JOptionPane.YES_NO_OPTION;
        int messageType = JOptionPane.QUESTION_MESSAGE;
        int option = JOptionPane.showConfirmDialog(parent, message, title, optionType, messageType);
        if (option == JOptionPane.YES_OPTION) {
            System.exit(0);
        }
    }
}

Código fonte da Tela 2:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Tela2 extends JFrame {

    private final Controle controle;

    // construtor que espera receber um objeto Controle como parâmetro
    Tela2(Controle controle) {
        super("Tela 2");
        this.controle = controle;
        setDefaultCloseOperation(HIDE_ON_CLOSE);
        setSize(800, 600);

        JButton buttonAbrirTela1 = new JButton("Abrir Tela 1");
        buttonAbrirTela1.addActionListener(event -> abrirTela1());

        JButton buttonAbrirTela3 = new JButton("Abrir Tela 3");
        buttonAbrirTela3.addActionListener(event -> abrirTela3());

        JPanel panelBotoes = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panelBotoes.add(buttonAbrirTela1);
        panelBotoes.add(buttonAbrirTela3);

        Container container = getContentPane();
        container.add(panelBotoes, BorderLayout.SOUTH);
    }

    private void abrirTela1() {
        Programa programa = Programa.INSTANCIA;
        Tela1 tela1 = programa.getTela1();
        tela1.setVisible(true);
        tela1.requestFocus();
    }

    private void abrirTela3() {
        Programa programa = Programa.INSTANCIA;
        Tela3 tela3 = programa.getTela3();
        tela3.setVisible(true);
        tela3.requestFocus();
    }
}

Código fonte da Tela 3:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Tela3 extends JFrame {

    private Controle controle;

    // construtor que espera receber um objeto Controle como parâmetro
    Tela3(Controle controle) {
        super("Tela 3");
        this.controle = controle;
        setDefaultCloseOperation(HIDE_ON_CLOSE);
        setSize(240, 320);

        JButton buttonAbrirTela1 = new JButton("Abrir Tela 1");
        buttonAbrirTela1.addActionListener(event -> abrirTela1());

        JButton buttonAbrirTela2 = new JButton("Abrir Tela 2");
        buttonAbrirTela2.addActionListener(event -> abrirTela2());

        JPanel panelBotoes = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panelBotoes.add(buttonAbrirTela1);
        panelBotoes.add(buttonAbrirTela2);

        Container container = getContentPane();
        container.add(panelBotoes, BorderLayout.SOUTH);
    }

    private void abrirTela1() {
        Programa programa = Programa.INSTANCIA;
        Tela1 tela1 = programa.getTela1();
        tela1.setVisible(true);
        tela1.requestFocus();
    }

    private void abrirTela2() {
        Programa programa = Programa.INSTANCIA;
        Tela2 tela2 = programa.getTela2();
        tela2.setVisible(true);
        tela2.requestFocus();
    }
}
M

Valeu velho, ajudou umonte.

Só pra concluir, se estou por exemplo, na tela 1, quando faço:

tela2.setVisible(true);
tela2.requestFocus();

eu posso dar um “tela1.setVisible(false)” pra ela não ficar visível, certo?

Criado 29 de maio de 2018
Ultima resposta 29 de mai. de 2018
Respostas 8
Participantes 3