Alterar valor de array de dentro de uma classe interna

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[] lá da classe principal.
    // porém só 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.

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.

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!

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.

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.

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.

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.

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!