Capturar componente da classe

15 respostas
A

Bom dia

Pessoal estou fazendo uns testes em classe java e desenvolvi um pequeno aplicatico que envia dados para uma classe e retorna as informações, Existem 5 campos no formulário onde manda para a classe aluno, consigo armazenar todos mas não consigo retornar os valores da JList, ele esta me retornando isso: [Lacademico.Disciplina;@7259da. Como eu corrijo? Veja como esta a minha classe:
A estrutura é simples tenho uma formulário onde o JList tem as displina em multipla escolha, a classe aluno agrega a classe disciplina e por meio de um array armazena os dados do JList, se eu exibir uma por uma as disiciplinas funciona mas preciso exibir todas de uma vez.

Esse é o código que exibe os dados, tudo exibe apenas a lista de displina que esta com esse problema de mostra um endereço

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
        for(int i=0 ; i<alunos.length ; i++)
        {
            txtExibir.setText(txtExibir.getText() +  "Aluno " + i + "\nRGM: " + alunos[i].getRGM() + "\nNome: " + alunos[i].getNome() +  "\nSobre Nome: " + alunos[i].getSobreNome() + "\nCampus: " + alunos[i].getCampus() + "\nDisciplinas: " + alunos[i].getDisciplinas().toString() + "\n\n");
        }
    }

Formulário:

public class CadastroAluno extends javax.swing.JFrame {
    Aluno aluno; 
    public CadastroAluno() {
        initComponents();
        carregarDisciplina();
    }

...
private void carregarDisciplina() {
           // Add new objects Diciplina into model
        mdlDis.add(0, new Disciplina("banco de dados"));
        mdlDis.add(1, new Disciplina("estrutura de dados"));
        mdlDis.add(2, new Disciplina("tecnicas de programação"));
        mdlDis.add(3, new Disciplina("engenharia de software"));
        mdlDis.add(4, new Disciplina("projetos de sistemas"));
      //set the default list model data into jlist
        txtDisciplina.setModel(mdlDis);
    }
...
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        aluno = new Aluno();
        Object obs[] = null;
       // if(alunos.length<10){
            aluno.setNome(txtNome.getText());
            aluno.setRGM(txtRGM.getText());
            aluno.setSobreNome(txtSobreNome.getText());
            aluno.setCampus(txtCampus.getText());
            
            obs = this.txtDisciplina.getSelectedValues();
            for(int i=0 ; i<obs.length ; i++)
            {
                aluno.setDisciplina((Disciplina)obs[i]);
            }
            
            this.alunos[this.qtdAluno++] = aluno;

            txtNome.setText(null);
            txtRGM.setText(null);
            txtSobreNome.setText(null);
            txtCampus.setText(null);
    }     
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
        for(int i=0 ; i<alunos.length ; i++)
        {
            txtExibir.setText(txtExibir.getText() +  "Aluno " + i + "\nRGM: " + alunos[i].getRGM() + "\nNome: " + alunos[i].getNome() +  "\nSobre Nome: " + alunos[i].getSobreNome() + "\nCampus: " + alunos[i].getCampus() + "\nDisciplinas: " + alunos[i].getDisciplinas().toString() + "\n\n");
        }
    }
private Aluno alunos[] = new Aluno[10];
    private int qtdAluno = 0;
}

Essa é a classe aluno:

package academico;
public class Aluno {

    private String rgm;
    private String nome;
    private String sobrenome;
    private String campus;
    private Disciplina disciplinas[] = new Disciplina[10];
     
    public void setNome(String n){
        this.nome = n;
    }
    public void setRGM(String rgm){
        this.rgm = rgm;
    }
    public void setSobreNome(String sn){
        this.sobrenome = sn;
    }
    public void setCampus(String c){
        this.campus = c;
    }

    public String getNome(){
        return this.nome;
    }

    public String getRGM(){
        return this.rgm;
    }
    public String getSobreNome(){
        return this.sobrenome;
    }
    
    public String getCampus(){
        return this.campus;
    }

    
    public void setDisciplina(Disciplina disciplina){
        if(disciplinas.length == 0)
            disciplinas[disciplinas.length] = disciplina;
        else
            disciplinas[disciplinas.length -1] = disciplina;
    }

    public void setDisciplina(Disciplina[] disciplinas){
        this.disciplinas = disciplinas;
    }

    public Disciplina getDisciplina(int index){
        return disciplinas[index];
    }

    public Disciplina[] getDisciplinas()
    {
        return disciplinas;
    }
    
    
}

Essa é a classe Disciplina

package academico;

/**
 *
 * @author emerson
 */
public class Disciplina {

    private String nome;
    private Departamento depto;

    /**
     * este construtor viola as restrições impostas no diagrama de classes.
     * @param nome String
     */
    public Disciplina(String nome) {
        this.nome = nome;
    }

    public Disciplina(Departamento depto) throws Exception{
        if(depto == null)
            throw new Exception("attribute depto cannnot be null.");
        this.depto = depto;
    }

    public Disciplina(String nome, Departamento depto) throws Exception{
        this(depto);
        this.nome = nome;
    }
    public String toString()
    {
        return nome;
    }
}

15 Respostas

L

A notação de [Lacademico.Disciplina;@7259da significa que ele está imprimindo o endereço de um array de objetos academico.Disciplina. Para imprimir o conteúdo do array, use java.util.Arrays.toString(). Para funcionar direitinho, sua classe Disciplina tem de ter um método toString()

A

Opa blz, Velho desculpa não entendi o que preciso fazer? Já tentei aqui mas não sai nada, tem como você me explicar como fazer isso? No caso minha classe disciplina tem esse método:

public String toString()
    {
        return nome;
    }

Seria isso? O que esta faltando fazer?

L

Trocar alunos[i].getDisciplinas().toString() por Arrays.toString(alunos[i].getDisciplinas())

L

Sugiro também utilizar um List no lugar de um array. Além de ter um toString() decente de graça, você fica com uma lista que cresce na medida da necessidade.

A

Nossa que simples pensei que eu ia ter que fazer um loop para exibir um por um srsrsrsr
Mas velho ainda estou com um erro, eu estou mandando por exemplo 3 dados para a disciplina ele só me lista o último da seguinte forma:
[null, null, null, null, null, null, null, null, null, engenharia de software]

Porque isso? Ele nã odeveria exibir apenas os 3 valores que mandei?

L

Não. Está fazendo o que o seu método "setDisciplina" está fazendo. O tamanho (length) de um array é sempre fixo.

public void setDisciplina(Disciplina disciplina){   
        if(disciplinas.length == 0)   //nunca é verdade
            disciplinas[disciplinas.length] = disciplina;   
        else   
            disciplinas[disciplinas.length -1] = disciplina;  //está sempre colocando na última posição.
    }

Troque o Disciplina[] por um List. Ficaria assim (com mais alguns métodos e tratamentos):

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class Aluno {

	private String rgm;
	private String nome;
	private String sobrenome;
	private String campus;
	private List<Disciplina> disciplinas = new ArrayList<Disciplina>();

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

	public void setRGM(String rgm) {
		this.rgm = rgm;
	}

	public void setSobreNome(String sn) {
		this.sobrenome = sn;
	}

	public void setCampus(String c) {
		this.campus = c;
	}

	public String getNome() {
		return this.nome;
	}

	public String getRGM() {
		return this.rgm;
	}

	public String getSobreNome() {
		return this.sobrenome;
	}

	public String getCampus() {
		return this.campus;
	}

	public void addDisciplina(Disciplina disciplina) {
		//todo mundo que adiciona algo delega para cá, se quiser fazer validação, pode fazer aqui
		disciplinas.add(disciplina);
	}
	
	public void removeDisciplina(Disciplina disciplina) {
		//todo mundo que remove algo delega para cá, se quiser fazer validação, pode fazer aqui
		disciplinas.remove(disciplina);
	}

	public void setDisciplinas(Collection<Disciplina> disciplinas) { 
		this.disciplinas.clear();
		this.addDisciplinas(disciplinas);
	}
	
	public void addDisciplinas(Collection<Disciplina> novasDisciplinas) {
		if (disciplinas == null) { return; } //evita nullpointerexceptions
		for (Disciplina d : disciplinas) {
			this.addDisciplina(d); //delegação ajuda a tratar a adição em um único método
		}
	}
	
	public void removeDisciplinas(Collection<Disciplina> novasDisciplinas) {
		if (disciplinas == null) { return; } //evita nullpointerexceptions
		for (Disciplina d : disciplinas) {
			this.removeDisciplina(d); //delegação ajuda a tratar a remoção em um único método
		}
	}
	
	public Disciplina getDisciplina(int index) {
		return disciplinas.get(index);
	}

	public Collection<Disciplina> getDisciplinas() { //não importa a coleção interna
		return Collections.unmodifiableList(disciplinas); //evita que alguém de fora altere a lista, só essa classe pode mexer
	}

}
A

Cara entendi, realmente minha função estava erra. Valeu mesmo pela explicação.
Vou estudar esse método que vocÊ passou e qualquer coisa grito aqui.

L

:thumbup:

“Feche” o tópico editando o título do primeiro post adicionando [RESOLVIDO] nele.

A

Opa só mais uma pergunta nesse tema, nessa mesma aplicação tenho o array alunos. Quero da mesma forma exibir o que tenho nele, tentei fazer da mesma forma que você informou mas ele só exibiu aquele tipo de endereço, coloquei dessa forma:

txtExibir.setText(Arrays.toString(alunos));

Mas ele exibir isso:
[academico.Aluno@1a125f0, null, null, null, null, null, null, null, null, null]

Não deveria funcionar também? Porque nedde caso não rolou?

L

Aluno não tem .toString(). Se o “endereço” começa com [, ele é um array. Se não, é um objeto “padrão” que não implementa .toString().

Os nulls são pelo mesmo motivo do anterior.

A

Opa blz
Então eu não me refiro ao objeto aluno, e sim ao array objeto alunos que criei:

private Aluno alunos[] = new Aluno[10];
veja na classe abaixo que faço isso:
this.alunos[this.qtdAluno++] = aluno;

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        aluno = new Aluno();
        Object obs[] = null;
        if(qtdAluno<10){
            aluno.setNome(txtNome.getText());
            aluno.setRGM(txtRGM.getText());
            aluno.setSobreNome(txtSobreNome.getText());
            aluno.setCampus(txtCampus.getText());
            
            obs = this.txtDisciplina.getSelectedValues();
            for(int i=0 ; i<obs.length ; i++)
            {
                aluno.setDisciplina((Disciplina)obs[i]);
            }
            this.alunos[this.qtdAluno++] = aluno;

            txtNome.setText(null);
            txtRGM.setText(null);
            txtSobreNome.setText(null);
            txtCampus.setText(null);

                    }
    }
L

Parece certo. Eu estava falando do resultado do .toString()… Ele imprimiu academico.Aluno@9237492 porque Aluno não implementa toString(). Não foi isso o que você perguntou?

A

É no resumo eu queria saber porque usando o toString no array alunos ele não exibe os dados que estão nele, ma acho que entendi o que você me falo, os dados que estão no array aluno são do abojeto Aluno e ele não implementa toString.
Se for isso entendi.

L

:thumbup: É isso aí!

A

Valeu

Criado 25 de maio de 2011
Ultima resposta 25 de mai. de 2011
Respostas 15
Participantes 2