Problemas em alimentar um jList

17 respostas
Eduardo_Rebou_s

Boa Tarde galera,

então já to a uns 2 dias procurando e não acho a solução disso...

seguinte tenho um jList que quero colocar o conteudo de uma tabela,

public List<User> listaFiltro(User u) throws SQLException{
            	String sql = "SELECT ID, Login, Senha ,Nivel, NomeUsuario, "+
                        "SetorUsuario, Validade FROM FAT_Login"+
                         " WHERE ID = ? OR NomeUsuario LIKE ?";

		PreparedStatement filtraStmt = conn.prepareStatement(sql);
		// seta valores
                filtraStmt.setInt(1, u.getId());
                filtraStmt.setString(2, ("%"+u.getNomeUsuario()+ "%"));

		//Executa o codigo sql e guarda no ResultSet
		ResultSet rs = filtraStmt.executeQuery();

                List<User> minhaLista = new ArrayList<User>();

                while(rs.next()){
                    User u1 = new User();
                    u1.setId(rs.getInt("id"));
                    u1.setLogin(rs.getString("login"));
                    u1.setSenha(rs.getString("senha"));
                    u1.setNivel(rs.getString("nivel"));
                    u1.setNomeUsuario(rs.getString("NomeUsuario"));
                    u1.setSetorUsuario(rs.getString("SetorUsuario"));
                    u1.setValidade(rs.getString("Validade"));
                    minhaLista.add(u1);
                }

                rs.close();
		filtraStmt.close();
                return minhaLista;

        }

ele me retorna tudo oque eu quero.. fiz o teste colocando no System.out

só que quando jogo no listbox me traz o package.User@148aa23

estou jogando a informação no list assim:

public void filtro(){
        try{
            LoginDAO dao = new LoginDAO();
            User u1 = new User();
            u1.setId(Integer.parseInt(jTextId.getText()));
            u1.setNomeUsuario(jTextNomeUsuario.getText());

            List<User> minhaLista = dao.listaFiltro(u1);
            jLstLista.setListData(minhaLista.toArray());

        }catch(SQLException ex){
            ex.printStackTrace();
        }

    }

desde já agradeço

abraço

Eduardo

17 Respostas

A

ele pegou o endereço de memória (você não sobreescreveu o método toString de Object)

ele me retorna tudo oque eu quero… fiz o teste colocando no System.out

só que quando jogo no listbox me traz o package.User@148aa23

estou jogando a informação no list assim:

Dá uma olhada na API

http://java.sun.com/javase/6/docs/api/

Segue o exemplo com String

String[] data = {"one", "two", "three", "four"};
 JList myList = new JList(data);
marcoslogan

e vc não colocou o try catch.

se vc deixou assim vai dar pau.

mjmendes

Alberes:
ele pegou o endereço de memória (você não sobreescreveu o método toString de Object)

ele me retorna tudo oque eu quero… fiz o teste colocando no System.out

só que quando jogo no listbox me traz o package.User@148aa23

estou jogando a informação no list assim:

Dá uma olhada na API

http://java.sun.com/javase/6/docs/api/

Segue o exemplo com String

String[] data = {"one", "two", "three", "four"}; JList myList = new JList(data);

Sobresceva o método toString no sua classe User e coloque para retornar o login ou o nome.

[]´s

Eduardo_Rebou_s

aeww era isso mesmo valew galera…

muito obrigado mesmo.

abraço

Eduardo_Rebou_s

ou tenho mais uma duvida…

seguinte… tem como fazer o index da list ser igual o id do meu db??

pq eu quero que quando click no item da list ele traga toda a informação do item.

desde já agradeço

Eduardo

M

Eduardo Rebou?s:
ou tenho mais uma duvida…

seguinte… tem como fazer o index da list ser igual o id do meu db??

pq eu quero que quando click no item da list ele traga toda a informação do item.

desde já agradeço

Eduardo


Bom, a informação já será resgatada pois existe um campo no objeto que represenda seu código.

Mas, se não me engano, a única maneira de garantir que os dados fiquem em ordem é implementar seu próprio ListModel e guardar a os objetos em ordem em uma lista lincada.

Eduardo_Rebou_s

Bom dia Marco,

ou teria como você postar um exemplo é que sou iniciante em java então não sei utilizar esse ListModel…

Vlw

Eduardo

M

Criar ListModels não é uma tarefa das mais triviais (apesar que quando você entende, fica simples). Vou postar um exemplo que acho que vai te ajudar:

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import javax.swing.AbstractListModel;

public class SortedListModel<T extends Comparable><T>> extends AbstractListModel {

	private static final long serialVersionUID = 1L;
	private List<T> objects;

	public SortedListModel() {
		objects = new LinkedList<T>();
	}

	public void add(T object) {
		objects.add(object);
		sortList();
		fireContentsChanged(this, 0, getSize());
	}
	
	public void addAll(List<T> list) {
		objects.addAll(list);
		sortList();
		fireContentsChanged(this, 0, getSize());
	}

	public void remove(T object) {
		objects.remove(object);
		sortList();
		fireContentsChanged(this, 0, getSize());
	}
	
	public void remove(int index) {
		remove(objects.get(index));
	}

	public void clear() {
		objects.clear();
	}
	
	@Override
	public Object getElementAt(int index) {
		return objects.get(index);
	}

	@Override
	public int getSize() {
		return objects.size();
	}

	private void sortList() {
		Collections.sort(objects);
	}
	
}

Para usar:

  1. Você deve manter uma instância dessa classe na sua classe que extende JFrame.
  2. Você deve usar essa instância como model para seu JList.
  3. Chame os métodos add() e remove() para adicionar e remover objetos dela.

Ficaria algo como:

// aqui é sua classe de interface gráfica

// junto da declaração de variáveis, coloque o model
private SortedListModel<User> model;

// ....

// em algum trecho do código, instancie o model
model = new SortedListModel<User>();
// e defina-o para seu JList
minhaLista.setModel(model);

// ...

// você pode adicionar a lista que você resgata do banco assim:
model.addAll(dao.listaFiltro(u1));

// para adicionar um único User, chame o método add()
// e para remover chame o remove() informando o objeto ou o índice dele
// para remover todos, chame o método clear()

Lembre-se que para que tudo isso funcione, sua classe User deve implementar Comparable.

M

Caramba… não dá pra colocar a definição da classe de forma correta aqui no fórum! Aparece um ">" a mais (depois de Comparable) do nada! :shock:

Olha só:
SortedListModel<T extends Comparable>

Isso está errado!

De qualquer forma, aqui vai o correto em anexo.

Eduardo_Rebou_s

Opa vlw Marco vou fazer aqui e posto se deu certo, vlw mesmo para a atenção.

abraço

Eduardo

Eduardo_Rebou_s

e aew Marco olha eu te chateando aqui denovo,

então na parte que declaro a variavel
private SortedListModel<User> model;

aparece o erro:
type parameter package.User is not within is bound

a minha classe User com o Comparable

package projetos1.logica;


import java.lang.ClassCastException;
import java.util.Comparator;

public class User implements Comparable {

    public String toString(){
        return nomeUsuario;
    }
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getNivel() {
		return nivel;
	}
	public void setNivel(String nivel) {
		this.nivel = nivel;
	}
	public String getNomeUsuario() {
		return nomeUsuario;
	}
	public void setNomeUsuario(String nomeUsuario) {
		this.nomeUsuario = nomeUsuario;
	}
	public String getSetorUsuario() {
		return setorUsuario;
	}
	public void setSetorUsuario(String setorUsuario) {
		this.setorUsuario = setorUsuario;
	}
	public String getValidade() {
		return validade;
	}
	public void setValidade(String validade) {
		this.validade = validade;
	}
	private int id;
	private String login;
	private String senha;
	private String nivel;
	private String nomeUsuario;
	private String setorUsuario;
	private String validade;

    public int compareTo(Object anotherUser) throws ClassCastException {
            if (!(anotherUser instanceof User))
                throw new ClassCastException
                        ("Objeto do Tipo User Esperado");
            int anotherUserId = ((User)anotherUser).getId();
            return this.id - anotherUserId;
    }

    public static Comparator NomeUsuarioComparator =
            new Comparator() {

        public int compare(Object user, Object anotherUser) {
            String nomeUsuario1 =
                    ((User)user).getNomeUsuario().toUpperCase();
            String nomeUsuario2 =
                    ((User)anotherUser).getNomeUsuario().toUpperCase();
            return nomeUsuario1.compareTo(nomeUsuario2);
        }
    };

}

(achei esse codigo no google então num sei se tá certo) :oops:

Abraço vlw :)

Eduardo

M

Sua classe deve implentar Comparable. Ela ficará assim:

public class User implements Comparable<User> {

	public String toString() {
		return id + " - " + nomeUsuario;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNivel() {
		return nivel;
	}

	public void setNivel(String nivel) {
		this.nivel = nivel;
	}

	public String getNomeUsuario() {
		return nomeUsuario;
	}

	public void setNomeUsuario(String nomeUsuario) {
		this.nomeUsuario = nomeUsuario;
	}

	public String getSetorUsuario() {
		return setorUsuario;
	}

	public void setSetorUsuario(String setorUsuario) {
		this.setorUsuario = setorUsuario;
	}

	public String getValidade() {
		return validade;
	}

	public void setValidade(String validade) {
		this.validade = validade;
	}

	private int id;
	private String login;
	private String senha;
	private String nivel;
	private String nomeUsuario;
	private String setorUsuario;
	private String validade;

	@Override
	public int compareTo(User anotherUser) {
		return this.id - anotherUser.getId();
	}

}
Eduardo_Rebou_s

:slight_smile: hehe bem mais facil haeuhaeueh

ou vlw mesmo… funcionou para adicionar… mais assim no caso se eu quiser no caso colocar o id no index tenho
que colocar o model.add() ou no model.addAll() vai?

Eduardo

M

Não entendi muito bem sua pergunta…

Eduardo_Rebou_s

ex: “Eduardo” tem o id 3,
como eu faria para colocar o “Eduardo” no index 3 sem ter os outros 3 nomes antes.

se não for possivel teria como eu jogar na lista o nome e o id?
se sim eu faria isso usando o model.add(nomeUsuario, id), ou posso colocar o model.addAll(dao.listaFiltroId(u1))

se for o model.addAll() como eu faço para pegar o Id e o Nome?

Grato

Eduardo

M

Mas nesse exemplo, se você não tem os dois primeiros usuários, como o terceiro ficaria no índice 3? Ficaria em “vácuo” em cima? Não parece muito bom…

Agora, lembre-se que o modelo suporta o seu objeto User (Java é orientado a objetos, então nada mais óbvio). A exibição é feita por um Redenrer (mas acho que fica fora do escopo por enquando). Logo, basta usar o addAll para inserir os usuários que vieram do banco de dados.

O que será mostrado no JList será o retorno do método toString() do seu User. Portanto, se você quiser mostrar o código também pode fazer algo como:

// classe User
public String toString() {
    return id + " - " + nome;
}
Eduardo_Rebou_s

humm… então eu sei que vc já deve ter explicado isso, mais só uma duvida… depois prometo que paro de te encher hehe

então no caso não tem como eu manipular a array e pegar o id? tipo mesmo que não apareça no listbox, só para eu guardar numa variável ou deixar a array aberta mesmo

abraço

Eduardo

Criado 15 de dezembro de 2009
Ultima resposta 22 de dez. de 2009
Respostas 17
Participantes 5