Comparar conteudo da JList

18 respostas
C

Bom dia.
Como eu faço para comparar o conteúdo de dois JList?
Por exemplo tenho JList A que é carrega com os dados de uma tabela do banco de dados, e outra JList B que é carregada com o conteúdo de outra tabela filha da primeira.
Então pode ser que vão aparecer informações duplicadas nas duas JList.
Quero fazer o seguite ler os dois conteúdos JList A e JList B.
O que aparecer na JList B não deve aparecer na JList A.
Como eu faço isso?? É possível?

18 Respostas

dudaskank

sim, A.removeAll(B);

C

Bom dia.
Da um erro:

sourceList.removeAll(destList); The method removeAll() in the type Container is not applicable for the arguments (Jlist)

sourceList é a Jlist A digamos e destList é a Jlist B mencionada na mensagem anterior

dudaskank

ops, não vi aquele J na frente das listas... isso vc usa pra remover de lista daquelas das collections. então, você vai precisar pegar os dados de suas JList e colocar em dois Vector, dar um removeAll() de um Vector no outro, e aí usar setListData, do JList, para alterar os dados do JList:

Vector listaA, listaB;
ListModel listModel;

listaA = new Vector();
listModel = a.getModel();
for (int i = 0; i < listModel.getSize(); i++) {
	listaA.add(listModel.getElementAt(i));
}

listaB = new Vector();
listModel = b.getModel();
for (int i = 0; i < listModel.getSize(); i++) {
	listaB.add(listModel.getElementAt(i));
}

listaA.removeAll(listaB);
a.setListData(listaA);
C

Valeu pelas dicas.
A tarde vou testar.

C

Para remover todos que aparecem na outra JList funcionol muito bem,
Agora quero remover o elemento selecionado com o mouse.
sourceList <=== É o Jlist que quero remover o registro selecionado com o mouse.

Tentei:

Object selected[] = sourceList.getSelectedValues();
 for (int i = selected.length - 1; i >= 0; --i) {
      sourceList.remove(i);
	    	
		      
 }

Mas não remove como posso fazer isso????

C

Bom dia.
Eu modifiquei um pouco a minha lógica para trabalhar com botões de adicionar e remover, passei a trabalhar com a classe DefaultListModel.
Então criei a seguinte lógica.

/
*** Fiz a definição***/
DefaultListModel modelsourceList;

/****Depois eu inicializo***
modelsourceList = new DefaultListModel();


/**** Leio o banco de dados***/

uprs = stmt.executeQuery("SELECT * FROM Qualificacoes");
while (uprs.next()){
         String codigo = uprs.getString("Codigo_Qualificacao");
         String descricao =  uprs.getString("Descricao");
          modelsourceList.addElement(codigo + " - " + descricao);

}

/**** Ai neste ponto ocorre o erro: ***/
java.lang.NullPointerException
	at cd0109.openQuery(cd0109.java:393)
Que é bem na minha que adiciono o elemento. O que pode ser?
C

O problema anterior qu resolvi so preciso saber como capturar o valor de tela da JList.
Tipo em tela esta codigo e descrição
10 - fundição,
Eu consigo captura o objeto

Object selected[] = sourceList.getSelectedValues();

Quero saber como pegar o valor 10 que esta me tela?

dudaskank

Bom, o método que vc está chamando remove os itens daquela posição da JList, mas você está simplesmente removendo os primeiros itens, já que vc vai de numero de itens selecionados - 1 até 0. Para remover os itens mesmo, ou você passa o índice dos que estão selecionados aí, ou passa os objetos para outro método:

sourceList.removeElement(selected[i]);

Nesse outro, acredito que o código ou a descrição possam estar vindo nulos, já que parece ok o resto…

flw

C

O problema de criar os registros em tela e remover eu já consegui solucionar.
A única coisa que falta fazer é conseguir capturar o valor de tela.
Vou dar o seguinte exemplo na tela tenho
Código e descrição.
10 - Fundição.
Quando eu clicar no botão de adicionar e jogar para a outra Jlist devo alimentar outra tabela do DB.
Com o código 10.
Eu consigo capturar o objeto do Jlist, da seguinte forma.

sourceList.getSelectedValues()

mas preciso pegar o valor 10.
Como eu faço isso é só que falta para terminar o programa.

dudaskank

você primeiro vai precisar criar uma classe que tenha estes dois atributos (ou usar alguma que já deve ter pronta), sobrescrever o método toString() dela para retorna o código mais o tracinho mais o nome, e no lugar de:

modelsourceList.addElement(codigo + " - " + descricao);

colocar:

modelsourceList.addElement(new SuaClasseComOsCamposAqui(codigo, descricao));

é bem parecido com o que ocorre aqui: http://www.guj.com.br/posts/preList/36663/194516.java#194516

C
Não deu muito certo pois quando eu crio o a minha lista eu faço o seguinte
uprs2 = stmt2.executeQuery("SELECT * FROM Qualificacoes");
  ArrayList myList = new ArrayList();
  while (uprs2.next()){
          String codigo    = uprs2.getString("Codigo_Qualificacao");
          String descricao =  uprs2.getString("Descricao");
           myList.add(codigo + " - " + descricao );
/*** Aqui eu crio a classe que guarda o nome e o código **/
           JlistVO parent = new JlistVO(codigo,descricao );
           parent.setCodigo(codigo);
           parent.setNome(descricao);
				
}
String[] myListString = new String[myList.size()];
for(int i=0;i<myList.size();i++){
      myListString[i] = (String) myList.get(i);
			}
/**** Aqui eu alimento a minha lista**/
this.addSourceElements(myListString); 



/**** Quando leio o elemento que estou adicionando para a outra Jlist***
private class AddListener implements ActionListener {
	    public void actionPerformed(ActionEvent e) {
/**** Neste ponto quero recuperar o valor e gravar no banco***/
	      JlistVO parent = (JlistVO) sourceList.getSelectedValue();
	      System.out.println(parent.getCodigo());
	      Object selected[] = sourceList.getSelectedValues();
	      addDestinationElements(selected);
	      clearSourceSelected();
	    }
	  }

Mas ocorre o seguinte errro:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String
	at cd0109$AddListener.actionPerformed(cd0109.java:549)
C

Consegui resolver todos os problemas, já elimino, adiciono.
Se tem uma coisa que vou lhe pedir vai parecer besta, comparado aos outros problemas.
mas já tentei de todas as formas e nada.
Tenho uma String que vem gravado neste formato:
[10 - Fundição].
Quero decompor e pagar separadamente o código e a descrção
tipo gravar em uma variavel o valor 10 e em outra o valor fundição.
Como ficaria o código para decompor separar e eliminar os “[ ]” e o " - "

dudaskank

Bom, sei que resolver mas… esse trecho aqui:

myList.add(codigo + " - " + descricao ); /*** Aqui eu crio a classe que guarda o nome e o código **/ JlistVO parent = new JlistVO(codigo,descricao ); parent.setCodigo(codigo); parent.setNome(descricao);

na verdade deveria ser:

/*** Aqui eu crio a classe que guarda o nome e o código **/ JlistVO parent = new JlistVO(codigo,descricao ); parent.setCodigo(codigo); parent.setNome(descricao); myList.add(parent);

mas acho que vc deve ter feito isso pra arrumar…

já o outro problema, esse pode paracer besta mas eu não sei hehehehe… vou fazer uns testes e ver o que sai.

flw

C

Aqui esta funcionando tudo agora falta só a deconposição da string.
Muito obrigado pela ajuda.

dudaskank

bom, deve haver um método melhor que esse, mas este funciona ehehe

package teste.guj;

public class TesteDescomporString {
	public static void main(String[] args) {
		String str = "10 - Testando-se";
		String[] separados = str.split("-", 2);
		System.out.println(separados[0].trim());
		System.out.println(separados[1].trim());
	}
}

isso aí sai na tela assim:

10
Testando-se

Veja se ajuda :)

C
desta forma funciona se a string vier assim:

String str = 10 - Testando-se;

O problema é que vem assim :

String str = [10 - Testando-se];

Mostra no console:

[10
Testando-se]

É este o meu problema.

dudaskank

epa, verdade... hehehe tenta isso então:

package teste.guj;

public class TesteDescomporString {
	public static void main(String[] args) {
		String str = "[10 - Testando-se]";
		str = str.substring(1, str.length() - 1);
		String[] separados = str.split("-", 2);
		System.out.println(separados[0].trim());
		System.out.println(separados[1].trim());
	}
}

assim o 1º e o último caractere serão descartados antes do split()...

flw

C

Valeu era isso mesmo.
Agora sim , esta funcionando muito obrigado.

Criado 20 de julho de 2006
Ultima resposta 21 de jul. de 2006
Respostas 18
Participantes 2