Dúvida com criação de um contador em uma classe, estando o vetor em outra classe

Não estou conseguindo enxergar um modo de ter um contador para vetor, que esteja em janelas secundárias, sem que ele se apague quando fechada.

Em outras palavras, estou criando uma janela com menu (Main), que abre várias janelas secundárias (para cadastro, leitura, … ), mas não estou conseguindo pensar um modo do contador do cadastro não zere, quando fecho a janela para por exemplo para fazer uma leitura em outra janela.

Sinto que essa minha dúvida seja bem besta, mas realmente não estou enxergando a solução.

=/

Não sei se vai resolver o seu problema, mas tenta declarar as variáveis que você vai usar como [color=blue]static[/color].

Deixar um contador estático não daria problema ???

Deixar um contador estático não daria problema ???[/quote]

Se esse valor deve ser global (único entre todas as classes), é a forma correta de se fazer.

Deixar um contador estático não daria problema ???[/quote]

Se esse valor deve ser global (único entre todas as classes), é a forma correta de se fazer.[/quote]

Poderia me dar um exemplo básico usando duas classes, uma com o contador e a outra usando esse contador em um vetor ??

Deixar um contador estático não daria problema ???[/quote]

Se esse valor deve ser global (único entre todas as classes), é a forma correta de se fazer.[/quote]

Poderia me dar um exemplo básico usando duas classes, uma com o contador e a outra usando esse contador em um vetor ??[/quote]

Não que isso venha a ser muito útil nesse meu exemplo abaixo pois so estou usando 2 classes e alterando o valor do contador apenas através de uma. O ideal seria se houvesse mais uma classe alterando esse contador, assim você poderia ver que todas as classes acessariam o mesmo valor.

[code]
public class Classe1 {

private static int contador;

public static final int getContador() {
    return contador;
}

public static final void incrementador() {
    contador++;
}

}[/code]

public class Classe2 {

    public static void main(final String[] args) {

        final int[] vetor = new int[10];
        
        for (int i = 0; i < vetor.length; i++){
            Classe1.incrementador();
            vetor[i] = Classe1.getContador();
        }
        
        for (int i = 0; i < vetor.length; i++){
            System.out.println("Posição do Vetor [" + i + "]: " + vetor[i]);
        }
    }

}

Como em nenhum momento eu dei “new” para acessar a Classe1, significa que todo mundo que acessar a classe em questão acessará o mesmo contador, ao invés de ter uma instância diferente de contador criada para cada nova chamada, como quando acontece com a palavra chave new.

[quote=dambros]Não que isso venha a ser muito útil nesse meu exemplo abaixo pois so estou usando 2 classes e alterando o valor do contador apenas através de uma. O ideal seria se houvesse mais uma classe alterando esse contador, assim você poderia ver que todas as classes acessariam o mesmo valor.

[code]
public class Classe1 {

private static int contador;

public static final int getContador() {
    return contador;
}

public static final void incrementador() {
    contador++;
}

}[/code]

public class Classe2 {

    public static void main(final String[] args) {

        final int[] vetor = new int[10];
        
        for (int i = 0; i < vetor.length; i++){
            Classe1.incrementador();
            vetor[i] = Classe1.getContador();
        }
        
        for (int i = 0; i < vetor.length; i++){
            System.out.println("Posição do Vetor [" + i + "]: " + vetor[i]);
        }
    }

}

Como em nenhum momento eu dei “new” para acessar a Classe1, significa que todo mundo que acessar a classe em questão acessará o mesmo contador, ao invés de ter uma instância diferente de contador criada para cada nova chamada, como quando acontece com a palavra chave new.[/quote]

Mais uma dúvida, como eu disse lá em cima, eu preciso usar isso em uma cadastro de pessoas, por tanto hora eu cadastro um, faço uma consulta, volto e cadastro mais 3 e por ai vai … por tanto não posso prender meu cadastro em um laço de “for”, se eu declarar assim:

public class Classe1 {

    private static int contador = 0;
.
.
.

O contador vai ser resetado toda vez que eu parar um cadastro e for fazer outra coisa, certo ?? Caso sim, como posso fazer para ele começar no zero apenas quando eu iniciar o programa ??

Eu não consigo visualizar a situação que está enfrentando, pois não consigo ver pra que serve seus vetores. Para que serve esse vetor?

Eu deixaria o contador dentro do construtor do POJO Pessoa por exemplo, assim toda vez que uma pessoa for criada (Pessoa p = new Pessoa()) esse contador será incrementado e é independente de janela ou o que for.

[quote=dambros]Eu não consigo visualizar a situação que está enfrentando, pois não consigo ver pra que serve seus vetores. Para que serve esse vetor?

Eu deixaria o contador dentro do construtor do POJO Pessoa por exemplo, assim toda vez que uma pessoa for criada (Pessoa p = new Pessoa()) esse contador será incrementado e é independente de janela ou o que for.

[/quote]

Seguinte, tenho que criar um programa utilizando interface (estou usando swing), para cadastrar pessoas e anúncios (eles se entrelaçam, pois um anúncio tem seu “dono”). Alem de cadastrar tenho que listar balanço de cada usuário e geral (oque vendeu, quanto ganhou, …). Por tanto preciso usar dois vetores para armazenar dados da classe pessoas e anúncios, sendo que a posição do vetor seria o ID.

Deu para entender mais ou menos ??

[quote=kauemartins][quote=dambros]Eu não consigo visualizar a situação que está enfrentando, pois não consigo ver pra que serve seus vetores. Para que serve esse vetor?

Eu deixaria o contador dentro do construtor do POJO Pessoa por exemplo, assim toda vez que uma pessoa for criada (Pessoa p = new Pessoa()) esse contador será incrementado e é independente de janela ou o que for.

[/quote]

Seguinte, tenho que criar um programa utilizando interface (estou usando swing), para cadastrar pessoas e anúncios (eles se entrelaçam, pois um anúncio tem seu “dono”). Alem de cadastrar tenho que listar balanço de cada usuário e geral (oque vendeu, quanto ganhou, …). Por tanto preciso usar dois vetores para armazenar dados da classe pessoas e anúncios, sendo que a posição do vetor seria o ID.

Deu para entender mais ou menos ??[/quote]

Não seria muito mais simples você persistir isso com mapeamento OneToOne ou OneToMany (caso uma pessoa possa ter mais de 1 anuncio)? Dai o banco se preocupará de fazer toda essa lógica para você…

Enfim, se quiser usar vetores eu não sei como poderia fazer essa lógica. Mas respondendo sua pergunta anterior, se você usar o código abaixo inicializando o valor com 0 ou não, será a mesma coisa. Uma vez que você instnacia um atributo estático, ele não será resetado novamente por novas instâncias. Pode chamar mil “new Classe1()” que o valor do contador não será zerado.

    private static int contador = 0;

Enfim, não vejo nem porque iniciar um tipo primitivo com 0, sendo que esse é seu valor default. Caso precisasse iniciar com algum outro valor além do 0, dai sim faria sentido.

[quote=dambros][quote=kauemartins][quote=dambros]Eu não consigo visualizar a situação que está enfrentando, pois não consigo ver pra que serve seus vetores. Para que serve esse vetor?

Eu deixaria o contador dentro do construtor do POJO Pessoa por exemplo, assim toda vez que uma pessoa for criada (Pessoa p = new Pessoa()) esse contador será incrementado e é independente de janela ou o que for.

[/quote]

Seguinte, tenho que criar um programa utilizando interface (estou usando swing), para cadastrar pessoas e anúncios (eles se entrelaçam, pois um anúncio tem seu “dono”). Alem de cadastrar tenho que listar balanço de cada usuário e geral (oque vendeu, quanto ganhou, …). Por tanto preciso usar dois vetores para armazenar dados da classe pessoas e anúncios, sendo que a posição do vetor seria o ID.

Deu para entender mais ou menos ??[/quote]

Não seria muito mais simples você persistir isso com mapeamento OneToOne ou OneToMany (caso uma pessoa possa ter mais de 1 anuncio)? Dai o banco se preocupará de fazer toda essa lógica para você…

Enfim, se quiser usar vetores eu não sei como poderia fazer essa lógica. Mas respondendo sua pergunta anterior, se você usar o código abaixo inicializando o valor com 0 ou não, será a mesma coisa. Uma vez que você instnacia um atributo estático, ele não será resetado novamente por novas instâncias. Pode chamar mil “new Classe1()” que o valor do contador não será zerado.

    private static int contador = 0;

Enfim, não vejo nem porque iniciar um tipo primitivo com 0, sendo que esse é seu valor default. Caso precisasse iniciar com algum outro valor além do 0, dai sim faria sentido.
[/quote]

Sou novo no mundo do java, puxei POO esse semestre na faculdade, pensei que o default era “lixo” como no C++.
Sobre o BD, eu pensei em fazer com banco, mas o professor não permitiu. Um degrau por vez, ele já está olhando com maus olhos eu usar interface, sendo ele nem ensinou isso ainda.

[quote=kauemartins][quote=dambros][quote=kauemartins][quote=dambros]Eu não consigo visualizar a situação que está enfrentando, pois não consigo ver pra que serve seus vetores. Para que serve esse vetor?

Eu deixaria o contador dentro do construtor do POJO Pessoa por exemplo, assim toda vez que uma pessoa for criada (Pessoa p = new Pessoa()) esse contador será incrementado e é independente de janela ou o que for.

[/quote]

Seguinte, tenho que criar um programa utilizando interface (estou usando swing), para cadastrar pessoas e anúncios (eles se entrelaçam, pois um anúncio tem seu “dono”). Alem de cadastrar tenho que listar balanço de cada usuário e geral (oque vendeu, quanto ganhou, …). Por tanto preciso usar dois vetores para armazenar dados da classe pessoas e anúncios, sendo que a posição do vetor seria o ID.

Deu para entender mais ou menos ??[/quote]

Não seria muito mais simples você persistir isso com mapeamento OneToOne ou OneToMany (caso uma pessoa possa ter mais de 1 anuncio)? Dai o banco se preocupará de fazer toda essa lógica para você…

Enfim, se quiser usar vetores eu não sei como poderia fazer essa lógica. Mas respondendo sua pergunta anterior, se você usar o código abaixo inicializando o valor com 0 ou não, será a mesma coisa. Uma vez que você instnacia um atributo estático, ele não será resetado novamente por novas instâncias. Pode chamar mil “new Classe1()” que o valor do contador não será zerado.

    private static int contador = 0;

Enfim, não vejo nem porque iniciar um tipo primitivo com 0, sendo que esse é seu valor default. Caso precisasse iniciar com algum outro valor além do 0, dai sim faria sentido.
[/quote]

Sou novo no mundo do java, puxei POO esse semestre na faculdade, pensei que o default era “lixo” como no C++.
Sobre o BD, eu pensei em fazer com banco, mas o professor não permitiu. Um degrau por vez, ele já está olhando com maus olhos eu usar interface, sendo ele nem ensinou isso ainda.[/quote]

Somos 2 novatos então :smiley: Mas o que der para ajudar, estou ai. J’a apanhei com as mesmas coisas.

Talvez no seu caso fosse mais fácil usar uma Hashtable que 2 vetores, assim não se preocuparia com ArrayOutOfBoundException, e talvez nem precisasse do contador:

//Primeira string = Autor e a segunda = anuncio
Hashtable<String, String> anuncios = new Hashtable();
	   anuncios.put("Jose da Silva", "José foi na praia");
	   anuncios.put("Fabio Silva", "Maria lavou roupa");
System.out.println(anuncios.get("Jose da Silva"));
//terá retorno de "José foi na praia"

[quote=dambros][quote=kauemartins][quote=dambros][quote=kauemartins][quote=dambros]Eu não consigo visualizar a situação que está enfrentando, pois não consigo ver pra que serve seus vetores. Para que serve esse vetor?

Eu deixaria o contador dentro do construtor do POJO Pessoa por exemplo, assim toda vez que uma pessoa for criada (Pessoa p = new Pessoa()) esse contador será incrementado e é independente de janela ou o que for.

[/quote]

Seguinte, tenho que criar um programa utilizando interface (estou usando swing), para cadastrar pessoas e anúncios (eles se entrelaçam, pois um anúncio tem seu “dono”). Alem de cadastrar tenho que listar balanço de cada usuário e geral (oque vendeu, quanto ganhou, …). Por tanto preciso usar dois vetores para armazenar dados da classe pessoas e anúncios, sendo que a posição do vetor seria o ID.

Deu para entender mais ou menos ??[/quote]

Não seria muito mais simples você persistir isso com mapeamento OneToOne ou OneToMany (caso uma pessoa possa ter mais de 1 anuncio)? Dai o banco se preocupará de fazer toda essa lógica para você…

Enfim, se quiser usar vetores eu não sei como poderia fazer essa lógica. Mas respondendo sua pergunta anterior, se você usar o código abaixo inicializando o valor com 0 ou não, será a mesma coisa. Uma vez que você instnacia um atributo estático, ele não será resetado novamente por novas instâncias. Pode chamar mil “new Classe1()” que o valor do contador não será zerado.

    private static int contador = 0;

Enfim, não vejo nem porque iniciar um tipo primitivo com 0, sendo que esse é seu valor default. Caso precisasse iniciar com algum outro valor além do 0, dai sim faria sentido.
[/quote]

Sou novo no mundo do java, puxei POO esse semestre na faculdade, pensei que o default era “lixo” como no C++.
Sobre o BD, eu pensei em fazer com banco, mas o professor não permitiu. Um degrau por vez, ele já está olhando com maus olhos eu usar interface, sendo ele nem ensinou isso ainda.[/quote]

Somos 2 novatos então :smiley: Mas o que der para ajudar, estou ai. J’a apanhei com as mesmas coisas.

Talvez no seu caso fosse mais fácil usar uma Hashtable que 2 vetores, assim não se preocuparia com ArrayOutOfBoundException, e talvez nem precisasse do contador:

//Primeira string = Autor e a segunda = anuncio Hashtable<String, String> anuncios = new Hashtable(); anuncios.put("Jose da Silva", "José foi na praia"); anuncios.put("Fabio Silva", "Maria lavou roupa"); System.out.println(anuncios.get("Jose da Silva")); //terá retorno de "José foi na praia" [/quote]

O problema que o cadastro tem que ser separado e os dados de Usuário e Anúncio, não restringe em uma só variável (nome).
Vou te mandar por MP, o roteiro para ver se consegue dar dicas mais fiéis ao meu problema.

Tenho algo mais concreto agora …

Parte onde cadastro na classe de cadastro:

[code] String txtNome = this.tf_Nome.getText();
String txtCPF = this.tf_CPF.getText();
String txtBairro = this.tf_Bairro.getText();
String txtCEP = this.tf_CEP.getText();
String txtCidade = this.tf_Cidade.getText();
String txtCompl = this.tf_Compl.getText();
String txtDataReg = this.tf_DataReg.getText();
String txtEmail = this.tf_Email.getText();
String txtEstado = this.tf_Estado.getText();
String txtNº = this.tf_Nº.getText();
String txtRua = this.tf_Rua.getText();

    Contadores.incrementadorUsuário();  
    cont = Contadores.getContadorUsuário();
    int ID = cont;
    vetor[cont] = new Usuário(txtNome, txtCPF, txtEmail, txtRua, txtNº, txtCompl, txtBairro, txtCidade, txtEstado, txtCEP, txtDataReg, ID);[/code]

[quote]public class Contadores {

private static int contadorUsuário = 0, contadorAnúncios = 0;

public static final int getContadorUsuário() {
    return contadorUsuário;
}

public static final void incrementadorUsuário() {
    contadorUsuário++;
}

public static final int getContadorAnúncios() {
return contadorAnúncios;
}

public static final void incrementadorAnúncios() {
    contadorAnúncios++;
}

}[/quote]

Fiz certo ???
Ele irá armazenar os dados na Classe Usuário certinho, sem perder dados ou onde o contador parou caso eu chame por exemplo a Classe de Listar ??
Eu coloquei um println do vetor, e na tela apareceu algo meio cabuloso … seria o endereço isso ??

O que apareceu deve ter sido algo do tipo “usuário@12891829128”, certo?

Você precisa sobrescrever o método toString() da classe usuário para que System.out.println(vetor[Usuario]) retorne algo “bonitinho” como você quer.

E eu colocaria o incrementador do contador de usuário dentro do construtor do usuário. Assim você simplesmente teria menos código e acessaria direto usuario.getContador() para pegar os dados. E faria o mesmo com os demais contadores obviamente.

[quote=dambros]O que apareceu deve ter sido algo do tipo “usuário@12891829128”, certo?

Você precisa sobrescrever o método toString() da classe usuário para que System.out.println(vetor[Usuario]) retorne algo “bonitinho” como você quer.

E eu colocaria o incrementador do contador de usuário dentro do construtor do usuário. Assim você simplesmente teria menos código e acessaria direto usuario.getContador() para pegar os dados. E faria o mesmo com os demais contadores obviamente.[/quote]

Só o incrementador ou o Contador também ???
Como eu estou fazendo tudo com interface, não preciso fazer essa transformação para String, a não ser que eu queira fazer este teste na janelinha de comandos, não ???
Ter aparecido esse “usuário@12891829128”, significa que armazenou certinho o dado né ???

Eu sumiria com o método e a classe incrementador e colocaria um contadorUsuario++ (atributo estático) no construtor do usuario e assim por diante.

No seu caso, o toString é so para confirmar que está sendo preenchido corretamente os atributos do Usuario, pois fica difícil afirmar que está certinho baseado nesse output. Mesmo se estivesse com todos os atributos vazios e tudo errado, o output seria ainda esse “usuário@12891829128”… fora isso, creio que não haja necessidade do toString(), a não ser que talvez você use o output dele para ajudar nos relatórios.