Passagem de parâmetros

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.

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

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?

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.

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?

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;
    }
}

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?

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();
    }
}

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?