Problemas de Iniciante =)

Bom Dia à Todos!! Seguinte, estou fazendo pós em Sistemas Web, e logo de inicio aprendemos um pouco sobre java e o professo já lascou um trabalho… objetivo é fazer o cadastro de Cargos, Departamentos, Funcionarios e relacionalos do tipo Funcionario X trabalha no setor Y do departamento Z

Bom, partindo do que aprendi na aula, criei as seguintes classes…

[spoiler]Cargo[code]import java.util.ArrayList;

public class Cargo {
private String nome;
private ArrayList funcionarios = new ArrayList();

public Cargo (){}

public Cargo (String nome, ArrayList funcionarios){
this.nome = nome;
this.funcionarios = funcionarios;

}

public Cargo(String nome){
	this.nome = nome;
}

public ArrayList<Funcionario> getFuncionarios() {
	return funcionarios;
}

public void setFuncionarios(ArrayList<Funcionario> funcionarios) {
	this.funcionarios = funcionarios;
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public void adicionarFuncionario(Funcionario funcionario){
	funcionarios.add(funcionario);
}

}
[/code][/spoiler]

[spoiler]Departamento[code]import java.util.ArrayList;

public class Departamento {
private String nome;
private ArrayList funcionarios = new ArrayList();

public Departamento(){}

public Departamento(String nome, ArrayList<Funcionario> funcionarios){
	this.nome = nome;
	this.funcionarios = funcionarios;
}

public Departamento(String nome){
	this.nome = nome;
}

public ArrayList<Funcionario> getFuncionarios() {
	return funcionarios;
}

public void setFuncionarios(ArrayList<Funcionario> funcionarios) {
	this.funcionarios = funcionarios;
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public void adicionarFuncionario(Funcionario funcionario){
	funcionarios.add(funcionario);
}

}
[/code][/spoiler]

[spoiler]Funcionario [code]
public class Funcionario {
private String nome;
private String cpf;

public Funcionario(){}

public Funcionario(String nome, String cpf){
	this.nome = nome;
	this.cpf = cpf;
}

public String getCpf() {
	return cpf;
}

public void setCpf(String cpf) {
	this.cpf = cpf;
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

}
[/code][/spoiler]

PROBLEMA: Logo quando começo a cadastrar o cargo na classe “Principal” ja da erro…o que to fazendo errado??

Principal[code]import java.util.ArrayList;

public class Principal {
public static void main(String[] args) {
ArrayList departamentos = new ArrayList();
Departamento depto;
ArrayList cargos = new ArrayList();
Cargo cg;
int opc;
do{
System.out.println("\n\n*** FOLHA DE PAGAMENTO ***");
System.out.println(“1 - Cadastrar Cargo”);
System.out.println(“2 - Cadastrar Departamento”);
System.out.println(“3 - Cadastrar Funcionario”);
System.out.println(“4 - Folha”);
System.out.println(“5 - Sair”);
opc = Console.readInt("Opção: ");
switch(opc){
case 1:
cadastrarCargo();
break;
case 2:
cadastrarDepartamento();
break;
case 3:
cadastrarFuncionario();
break;
case 4:
executaFolha();
break;
}
}while(opc != 5);
}

private static void cadastrarCargo(){
	System.out.println("\n\n");
	Cargo cg = new Cargo();
	cg.setNome("Nome do cargo: ");
	cargos.add(cg);    // <-- da erro nessa linha "cargos cannot be resolved"
}	

}[/code]

A varável cargos não é visível ao método cadastrarCargo

public class Principal {   
    static ArrayList<Cargo> cargos = new ArrayList<Cargo>(); 
    public static void main(String[] args) {   
...

Voce deixou esse List no método main. Não tem como acessar no outro método. Veja sobre escopos de variaveis.

Um modo melhor de se trabalhar seria a seguinte:

import java.util.ArrayList;


public class Principal {
        ArrayList<Departamento> departamentos = new ArrayList<Departamento>();
		Departamento depto;
		ArrayList<Cargo> cargos = new ArrayList<Cargo>();
	public Principal(){
		Cargo cg;
		int opc;
		do{
			System.out.println("\n\n*** FOLHA DE PAGAMENTO ***");
			System.out.println("1 - Cadastrar Cargo");
			System.out.println("2 - Cadastrar Departamento");
			System.out.println("3 - Cadastrar Funcionario");
			System.out.println("4 - Folha");
			System.out.println("5 - Sair");
			opc = Console.readInt("Opção: ");
			switch(opc){
				case 1:
					cadastrarCargo();
					break;
				case 2:
					cadastrarDepartamento();
					break;
				case 3:
					cadastrarFuncionario();
					break;
				case 4:
					executaFolha();
					break;
			}
		}while(opc != 5);
	}

	private void cadastrarCargo(){
		System.out.println("\n\n");
		Cargo cg = new Cargo();
		cg.setNome("Nome do cargo: ");
		cargos.add(cg);    // <-- da erro nessa linha "cargos cannot be resolved"
	}
	public static void main(String[] args) {
          new Principal();
        }
}

Desse modo voce já não precisa desses métodos statics.

PS: Aqui não existe tag spoiler.

[quote=MAGNUS-CTBA]
Principal[code]import java.util.ArrayList;

public class Principal {
public static void main(String[] args) {
ArrayList departamentos = new ArrayList();
Departamento depto;
ArrayList cargos = new ArrayList();
Cargo cg;
int opc;
do{
System.out.println("\n\n*** FOLHA DE PAGAMENTO ***");
System.out.println(“1 - Cadastrar Cargo”);
System.out.println(“2 - Cadastrar Departamento”);
System.out.println(“3 - Cadastrar Funcionario”);
System.out.println(“4 - Folha”);
System.out.println(“5 - Sair”);
opc = Console.readInt("Opção: ");
switch(opc){
case 1:
cadastrarCargo();
break;
case 2:
cadastrarDepartamento();
break;
case 3:
cadastrarFuncionario();
break;
case 4:
executaFolha();
break;
}
}while(opc != 5);
}

private static void cadastrarCargo(){
	System.out.println("\n\n");
	Cargo cg = new Cargo();
	cg.setNome("Nome do cargo: ");
	cargos.add(cg);    // <-- da erro nessa linha "cargos cannot be resolved"
}	

}[/code][/quote]

O Erro está acontecendo por que a variável

cargos.add(cg);

Só está visível para o método main. Você pode fazer de duas formas, colocar a linha:

ArrayList<Cargo> cargos = new ArrayList<Cargo>();

Fora do método main a variável cargos fica como se fosse global.

A outra forma é passar por parâmetro a variável cargos para que o método cadastrarCargo possa usá-lo.

private static void cadastrarCargo(ArrayList<Cargo> cargos){
..
}

Espero ter ajudado…

Abraço.

Hamilton

vc pode instanciar o seu arraylist cargos dentro de:

private static void cadastrarCargo(){ 

Uma boa dica: eh melhor criar uma classe onde terao os codigos para cargo por exemplo:

public class CadastroCargo{

public void cadastrarcargo(Cargo cargo){
...
}

public void removerCargo(...){
...
}

alterar(){}
consultar(){}

a implentaçao fica para vc fazer.

enfim, isso eh so uma dica mas vc pode fazer como quiser.

Espero ter ajudado!

Iaew gente!!

Bom, fiz uns ajustes conforme acima e tá belezinha agora…bom, agora vou mostrar minha principal novamente, e gostaria que me ajudassem também em fazer com que quando adicionar 1 funcionario, armazenasse o cargo e o departamento no mesmo…pois do jeito que está nao ta dando… =/ acho que deveria colocar algo na classe funcionario, mas nao sei como fazer =**

Segue abaixo as classes do funcionario e o novo "principal…

Muito obrigado gente pelas dicas…

[code]import java.util.ArrayList;

public class Principal {
static ArrayList cargos = new ArrayList();
static ArrayList departamentos = new ArrayList();
static ArrayList funcionarios = new ArrayList();
public static void main(String[] args) {
int opc;
do{
System.out.println("\n\n*** FOLHA DE PAGAMENTO ***");
System.out.println(“1 - Cadastrar Cargo”);
System.out.println(“2 - Cadastrar Departamento”);
System.out.println(“3 - Cadastrar Funcionario”);
System.out.println(“4 - Folha”);
System.out.println(“5 - Sair”);
opc = Console.readInt("Opção: ");
switch(opc){
case 1:
cadastrarCargo();
break;
case 2:
cadastrarDepartamento();
break;
case 3:
cadastrarFuncionario();
for(Cargo c: cargos){
System.out.println(c.getNome());
}
String cargo = Console.readString("Digite um dos cargos acima: ");
for(Departamento d: departamentos){
System.out.println(d.getNome());
}
String depto = Console.readString("Digite um dos departamentos acima: ");
break;
case 4:
// executaFolha();
break;
}
}while(opc != 5);
}

private static void cadastrarCargo(){
	System.out.println("\n\n");
	Cargo cg;
	String nome = Console.readString("Nome do cargo: ");
	cg = new Cargo(nome);
	cargos.add(cg);
}	

private static void cadastrarDepartamento(){
	System.out.println("\n\n");
	Departamento depto;
	String nome = Console.readString("Nome do Departamento: ");
	depto = new Departamento(nome);
	departamentos.add(depto);
}	

private static void cadastrarFuncionario(){
	System.out.println("\n\n");
	Funcionario func;
	String nome = Console.readString("Nome do Funcionario: ");
	func = new Funcionario(nome);
	funcionarios.add(func);
}	

}
[/code]

Funcionario

public class Funcionario {
	private String nome;
	
	public Funcionario(){}
	
	public Funcionario(String nome){
		this.nome = nome;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
}

Repetindo…eu tive apenas 1 dia de aula sobre isso (sabado o dia todo :cry: ) por isso tenho algumas duvidas…

Obrigado pela compreensão!

uma boa dica é:
para você dá uma olha nas class, e veja quais delas tem variáveis que recebe o mesmo
tipo de atributo, por exemplo as três class que você criou tem a variável nome, então se você
extends as suas class, automatica mente você fará com a as outras sejam atribuidas


class Cargo {

        private String name;

        public Cargo( String name ){
                  name = name;
        }
       
        public String getName(){ return name; }
}

class Funcionario extends Cargo {

       private String cpf;

       public Funcionario( String name, String cpf ){
                //quando usa-se herança, a primeira linha de código
                //do construtor tem que ser a chamado da class herdada
                super( name );

                this.cpf = cpf;
       }

       public String getName(){
                return super.getName();
       }

       public String getCPF(){
                return this.cpf;
       }
}

Mas os nome são diferentes não? Eu não posso atribuir o mesmo nome do funcionario “João” por exemplo para o nome da classe cargo, e se eu colocar extends acontece isso certo?

Eu tava pensando em fazer tipo, quando o cara digita o nome do funcionario ele percorre o arrau de cargos e mostra todos, ae o cara escreve o cargo e se não tive ele não deixa adiciona o cargo…e essa variavel cargo ficaria armazenada na classe funcionario, ta errado? faria o mesmo para departamento… algm da um help? =)