Alterar valor de array de dentro de uma classe interna

7 respostas
javaarray
V

Olá pessoal Estou começando a estudar Java. Já li muito sobre programação orientada a objetos, tenho o famoso livro “Como Programar em Java” e atualmente estou exercitando Interfaces Gráficas à mão.

Estou enfrentando uma dificuldade, e eu acredito que esteja relacionado a conhecimentos básicos (talvez eu tenha pulado alguns degraus na curva de aprendizado). Passagem de parâmetros ou então encapsulamento.

Para vocês entenderem, meu programa tem três classes: Principal, Tela e Aluno.

  1. A Classe Principal contem o “main”, o qual inicializa um vetor alunos[], no qual ficarão armazenados todos os alunos;

  2. A Classe Tela (JFrame) onde há um construtor que desenha os componentes e uma classe interna que trata dos eventos.

  3. A Classe Aluno com os atributos, construtor(es) e métodos set e get.

Como eu estou fazendo:
Para eu conseguir alterar o array alunos[] através da Classe “Tela”, eu precisei enviar o array alunos[] como parâmetro para o construtor da Classe “Tela”, tendo dentro de “Tela” outro array idêntico a alunos[] para receber. Não consegui acessar o vetor criado em “main”.

E esse array idêntico (que falei logo acima) não está sendo acessível pela classe interna que trata dos eventos de “Tela”. Para isso fiz o mesmo procedimento: enviei o vetor idêntico como parâmetro (na criação do objeto handler) ao construtor da classe interna.

O que eu achei estranho é que as variáveis que armazenam (ou identificam) os JLabel e JTextField estão acessíveis pela classe interna, MAS as outras variáveis e vetores não. Independentemente de estarem public ou private (ou protected se for o caso).

Eu acho um retrabalho imenso passar vetores como parâmetro toda vez que tenho armazenar dados em alunos[]. Sendo que na verdade eu não estou conseguindo alterar alunos[], somente os vetores idênticos, em princípio.

O programa tem 1 (uma) janela simples, com um JLabel “Nome do Aluno” e um JTextField que receberá o nome pelo usuário - sendo os dois componentes dentro de um JPanel.
E também um botão que irá cadastrar o aluno, ou seja, salvar os dados do JTextField do vetor alunos[] da classe Principal.

Sinto que não estou fazendo do jeito certo, mas não consigo encontrar solução. Eu queria poder acessar diretamente o vetor alunos[] da classe Main.

É possível?

Veja:

  1. Classe Principal:

    public class Programa {

    public void main (String args[]) {
    
    Aluno alunos[] = new Aluno[1000];
    
    Tela tela= new Tela(alunos);
    
    tela.setVisible(true);
    
    }
    
    }
    
  2. Classe Tela (resumida)

    public class Tela extends JFrame {
    public Aluno a[] = new Aluno[1000];

    public Tela(Aluno aRecebido[]) {
    // lalala…

    Handle ouvido = new Handle(a); // veja que aqui eu mandei o vetor como parametro
    
    botaoConfirmar.addActionListener(ouvido);
    
    }
    
    // classe interna
    
    public class Handle implements ActionListener {
    
    // vetor q vai receber
    
    public Aluno a[] = new Aluno[1000];
    
    //construtor
    
    public Handle(Alunos alunos[]) {
    
    // seta pra poder usar
    
    for (int k = 0; k < a.length ; k++) {
    
    this.a[k] = alunos[k];				
    
    }	
    
    }
    
    // tratamento do evento
    
    public void actionPerformed(ActionEvent e ) {
    
    // acontece a efetivação do cadastro, ou seja, salvar no vetor alunos[]  da classe principal.
    
    // porém  consigo alterar o array da classe interna AQUI ESTÁ A DÚVIDA- POR QUÊ?
    
    }
    

    }

Obrigado! Tentei demonstrar minha dúvida, espero que esteja fácil de entender. Primeiro tópico.

7 Respostas

M

Seu vetor alunos[] na classe Programa, está no escopo de um método, no caso o método main. Se você deseja alterar algo, você deve criar no escopo da classe, fora de qualquer método.

Por exemplo:

public class SuaClasse {
	String[] strings = new String[1000]; // declarado no escopo da classe, fora de um método
	
	public static void main(String[] args) {
		// aqui você executa suas ações..
	}
}

Outra coisa: seria melhor você iniciar sua tela, e não a classe Programa.
Ao iniciar a classe Tela, você cria uma instância de Programa. Dessa forma você consegue acessar a classe pela instância e pode inserir dados no vetor.

V

Entendi. Mas acho que não se aplica muito bem no que estou querendo. Talvez a minha forma de pensar o programa não está muito correta.

Eu já sei o que são interfaces, classes abstratas, herança todas essas coisas… Mas parece que quando vamos para o universo GUI as coisas começam a não fazer mais sentido, ou então a forma de pensar o programa é fica diferente. Eu, pelo menos tenho a tendência a codificar as coisas dentro do método de tratamento dos eventos, ao invés de criar um objeto de uma classe que vai controlar as coisas por exemplo. Ainda estou aprendendo a como realmente implementar isso.

Vou aqui tentando programas simples, exercitando várias maneiras, inclusive criando diagrama de classes antes e revisando conceitos.

Eu estava acostumado a programar em pascal e criar jogos em Blitz3d e Dark Basic Pro. E só agora comecei a entender coisas que antes eram um mistério pra mim.

Obrigado mesmo!

P

Mandaste o vetor como parâmetro mas não o que recebeste no construtor (e que vinha do main de Programa) mas um outro que tens declarado na tua class Tela. A não ser que tenha, nesse construtor, na parte lalala

a = aRecebido;

isso não vai funcionar.

V

Eu achei que ao declarar uma variável como “public int variavel = 0;” numa classe “classeA” ela seria acessível em outra classe “classeB” simplesmente digitando em “Classe B” “variavel = 9;” por exemplo. Meu entendimento quanto a encapsulamento estava incorreto. Eu achei que havia entendido. Tenho que estudar mais.

V

Deixa eu entender. Para acessar um vetor da “classeA” eu preciso receber aquele vetor como parâmetro (seja num construtor ou num método) e armazená-lo em um vetor idêntico declarado na “ClasseB”? Mas e aí, quando eu armazenar um valor neste vetor de “ClasseB” eu estou salvando em A ou B? Comecei a perceber que eu “pensei que sabia” hehe.

P

Só deves criar o array uma vez (dar o new) depois podes passar como parametro para onde precisas. Não estas a alterar em A ou B, já que o array é o mesmo, só está referenciado de sítios diferentes.

V

Que bom, isso que eu queria ter certeza.

Mas eu não consegui. Quando eu tento acessar um método desse vetor recebido como parâmetro "array[indiceQualquer].fazCoisa() eu não consigo. Eu só consigo se criar um array nessa outra classe que receberá esse array enviado como parâmetro. Está certo? O que estou errando?:smiley:

EDITADO 17:38
Acho que agora consegui. Eu estava cometendo errinhos bobos. Mas consegui. Obrigado pela dica!

Criado 4 de janeiro de 2017
Ultima resposta 8 de jan. de 2017
Respostas 7
Participantes 3