Exibir um campo de um objeto List no JList

Vou tentar ser sucinto:
Quero Exibir um JList com uma lista de objetos Aluno (o que já consigo fazer) porém quero que só sejam exibidos os nomes dos alunos (a classe tem nome, cpf, cep, etc…), e ao selecionar o nome do aluno ele pegar na verdade o objeto Aluno todo…
Pra colocar os objetos no JList estou fazendo assim

List<Aluno> alunos = controle.consultarAluno(txtNome.getText()); lstAlunos.setListData(alunos.toArray());

Busco pelo nome, retorna uma lista, carrego a lista no JList e lá na tela aparece isso:
[Ljava.lang.Object;@7eb366

Em vez desse nome estranho eu quero exibir o nome do aluno, só não estou encontrando nenhum método do JList pra isso, nem nenhuma forma, se alguem puder me ajudar ainda hoje (preciso entregar o trabalho amanha) :wink:
Grato.

Faz assim sobrescreva o método toString para retornar o nome na sua classe Aluno

[quote=otaviojava]Faz assim sobrescreva o método toString para retornar o nome na sua classe Aluno
[/quote]

Mas aonde eu utilizaria o método toString na JList pra exibir os nomes?
Pra passar a lista to usando toArray

Em sua classe Aluno

Sobrescreva o método ToString

Ficaria assim:
Na classe Aluno

	@Override
	public String toString() {
		return nome;
	}

[quote=otaviojava]Em sua classe Aluno

Sobrescreva o método ToString

Ficaria assim:
Na classe Aluno

	@Override
	public String toString() {
		return nome;
	}

[/quote]

Sim, mas isso não influencia como os objetos são exibidos na JList, pois não estou usando o método toString em lugar algum…

Se houvesse como eu sobrescrever o toArray, ai sim talvez alterasse algo, pq eu to usando o toArray, não adianta sobrescrever o toString se eu não estou usando ele, a menos que eu possa usá-lo de alguma forma no JList pra passar os objetos…

Aqui denovo o código, é só isso, não tem toString aqui:

List<Aluno> alunos = controle.consultarAluno(txtNome.getText()); lstAlunos.setListData(alunos.toArray());

Se puder mostrar alguma forma de passar a List pro JList usando toString eu agradeço…

Veja bem.
Todas as classes herdam da Classe Object.
E o jslit pega por parâmetro uma Array de Objetc e quando joga na tela ele utiliza o método ToString.
Sua classe Aluno não é diferente ela também herda dessa classe e quando vai ser jgoada para tela ele usa o método toString do Objetct.
Se você quer colocar o nome simplesmente sobrescreva o método.
Faz uma tentativa sobrescrevendo esse método na classe aluno e se não der certo posta aqui no fórum.

[quote=otaviojava]Veja bem.
Todas as classes herdam da Classe Object.
E o jslit pega por parâmetro uma Array de Objetc e quando joga na tela ele utiliza o método ToString.
Sua classe Aluno não é diferente ela também herda dessa classe e quando vai ser jgoada para tela ele usa o método toString do Objetct.
Se você quer colocar o nome simplesmente sobrescreva o método.
Faz uma tentativa sobrescrevendo esse método na classe aluno e se não der certo posta aqui no fórum.
[/quote]

Na primeira vez que sugeriu eu já tentei sobrescrever e não deu certo.

o método toArray retorna um array contendo os elementos da lista, ou seja

Creio que depois disso o JList percorra o array e chama o método toString de cada elemento, ou seja, de cada aluno

Muito Estranho isso.
Tem como postar as classes em ?

Classe Aluno

@Override public String toString(){ return getNome(); }

TelaAluno

List<Aluno> alunos = controle.consultarAluno(txtNome.getText()); lstAlunos.setListData(alunos.toArray());

Saída na JList
[Ljava.lang.Object;@14acfcd
[Ljava.lang.Object;@90d8ea

[quote=otaviojava]Muito Estranho isso.
Tem como postar as classes em ?[/quote]

É só um pojo normal

[code]package model;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@SuppressWarnings(“serial”)
@Entity
@Table(name=“ALUNO”)
public class Aluno implements Serializable {

@Id
@GeneratedValue
@Column(name="aluno_id")
private int alunoId;

@Column(nullable=false, length=30)
private String nome;

@Column(nullable=false, length=11)
private String cpf;

@Column(nullable=false, length=8)
private String cep;

@Column(nullable=false, length=8)
private String tel;

@ManyToMany(targetEntity=Curso.class,
		cascade={CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name="ALUNO_CURSO",
		joinColumns=@JoinColumn(name="aluno_id"),  
    inverseJoinColumns=@JoinColumn(name="curso_id"))  
private List<Curso> cursos;

public Aluno() {
	
	
}

public String getNome() {
	return nome;
}

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

public String getCpf() {
	return cpf;
}

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

public String getCep() {
	return cep;
}

public void setCep(String cep) {
	this.cep = cep;
}

public String getTel() {
	return tel;
}

public void setTel(String tel) {
	this.tel = tel;
}

public long getAlunoId() {
	return alunoId;
}

public List<Curso> getCursos() {
	return cursos;
}

public void setCursos(List<Curso> cursos) {
	this.cursos = cursos;
}

@Override
public String toString(){
	return getNome();
}

}
[/code]

Muito Estranho isso.
Tenta fazer uma Lista somente com o nome dos Alunos.

Foi mal a demora, tava tentando resolver aqui de algum outro jeito (sem sucesso)…

[quote=otaviojava]Muito Estranho isso.
Tenta fazer uma Lista somente com o nome dos Alunos.
[/quote]

Tentei passar só os nomes e deu erro:

TelaAluno

List<Aluno> alunos = controle.consultarAluno(txtNome.getText()); List nomes = new ArrayList(); for(Aluno a : alunos){ nomes.add(a.getNome()); } lstAlunos.setListData(nomes.toArray());

A busca no AlunoDAO consultar

[code]public List consultar(String nome) throws Exception {

	String sql = "SELECT * FROM aluno a WHERE a.nome LIKE '"+nome+"%' ";
    SQLQuery q = getSession().createSQLQuery(sql);
    List<Aluno> listaAlunos = (List<Aluno>) q.list();
    return listaAlunos;
	
}[/code] ps: Ele dá um aviso em "(List<Aluno>) q.list()" falando "Unchecked cast from List to List<Aluno>"

Não sei se tem a ver…

e o erro:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to model.Aluno

nessa linha:
for(Aluno a : alunos){

Será que minha busca não tá retornando uma lista de Alunos? Não sei mais o que fazer :cry:

Esse erro de cast.
No método toArray ele retorna um Array de Objetos,
Verifica aonde se está fazendo um cast para Alunos

[quote=otaviojava]Esse erro de cast.
No método toArray ele retorna um Array de Objetos,
Verifica aonde se está fazendo um cast para Alunos

[/quote]

Não entendi, verificar como?
eu debuggei e ele dá erro quando vai adicionar um objeto da List alunos no objeto a que é do tipo Aluno

Ele não chega na linha onde eu passo a List nomes pro JList

Durante a busca sql, no debug, mostra
Name____________Value
listaAlunos________ArrayList

Isso quer dizer que o listaAlunos não retorna um List ou esse ArrayList é o padrão pras listas?
Não sei como verificar se o cast tá funcionando…

É nessa linha que dá erro repare

List<Aluno> listaAlunos = (List<Aluno>) q.list(); 

Esse cash o método q.list joga uma lista de Objetos

Tente assim:

List<Objetct> listaAlunos =q.list(); 

E no for você faz assim:

for(Object a : alunos){  
if(a instaceof Aluno){
Aluno aluno=(Aluno)a;
//operação
}
}

[quote] for(Object a : alunos){ if(a instaceof Aluno){ Aluno aluno=(Aluno)a; //operação } } [/quote]

Ele nunca passa pelo if, a nunca é instanceof de Aluno…

To sem tempo pra tentar resolver isso ainda hoje, vou tirar essa parte de consulta do aluno e pra exibir os cursos vou tentar usar um Jcombobox mesmo… :shock: (se é que não vai dar o mesmo problema)

Mas vlw pela ajuda, outra hora tento descobrir qual foi o problema ai volto aqui…
abçs

Tenta isso

JList list = new JList(new Vector(lista));    

Tive que fazer umas gambiarras, o que deu pra tirar eu tirei, mas precisava mostrar uma lista de cursos pra adicionar ao aluno, então fiz assim…

na tela:

if(e.getActionCommand().equals("Salvar")){ Aluno aluno = new Aluno(); aluno.setNome(txtNome.getText()); aluno.setCep(txtCep.getText()); aluno.setCpf(txtCpf.getText()); aluno.setTel(txtTel.getText()); List<Curso> cursos = new ArrayList<Curso>(); if(!lstCursos.isSelectionEmpty()){ cursos = control.criarLista(lstCursos.getSelectedValues()); aluno.setCursos(cursos); List<Aluno> alunos = new ArrayList<Aluno>(); for(Curso curso : cursos){ alunos = curso.getAlunos(); alunos.add(aluno); curso.setAlunos(alunos);

populei a JList com uma List de String com o nome dos cursos

public List<String> listar() throws Exception { String sql="SELECT c.name FROM curso c"; SQLQuery q = getSession().createSQLQuery(sql); return (List<String>) q.list(); }

Depois busquei os nomes um por um retornando o curso com aquele nome

[code]public List buscaCurso(String nome) {
List cursos = getSession().createCriteria(Curso.class)
.add( Restrictions.like(“name”, nome) )
.list();
return cursos;

	}[/code]

Controle

public List<Curso> criarLista(Object[] objects){ List<Curso> cursos = new ArrayList<Curso>(); for(Object obj : objects){ String nome = obj.toString().toLowerCase(); List<Curso> c = daof.getCursoDAO().buscaCurso(nome); for(Curso curso : c){ cursos.add(curso); } } return cursos; }

pra enfim adicionar os cursos selecionados ao aluno, e só funcionou quando usei Criteria, pq dá pra especificar a classe e ele retornava um Curso, quando usei sql ou hql ele retornava Object…
Acredito que fazendo uma busca com Criteria anteriormente eu conseguisse retornar uma lista de Alunos sem dar erro de cast…
Quanto ao problema pra exibir pelo nome, vou pesquisar pq sobrescrever toString não resolveu…
Vlw…