Pegar item selecionado na jlist

27 respostas
P

oi,
tenho uma tela com uma jlist de disciplinas e preciso adicionar em outra tela os modulos que correspondem a ou as disciplinas selecionadas e gostaria de saber como eu pego um item selecionado da jlist e como faço isto se ela esta em outra tela?!!!
obrigada

27 Respostas

R
nomes.get(index)

se a outra tela for relacionada a sua primeira vc pode mandar a tela aonde está sua LIST na hora de instanciar a segunda tela

public class PrimeiraTela{

   SegundaTela sT = new SegundaTela(this);

}

o metodo construtor da Segunda Tela fica assim

PrimeiraTela minhaVariavel;

public SegundaTela (PrimeiraTela pt){
          ......
          this.pt = minhaVariavel;
}
dai vc cria este metodo na primeira tela
public JList getLista(){
   return suaLista;
}

quando vc for utilizar a lista da primera tela na segunda vc faz isso

minhaVariavel.getLista(); // assim vc tem acesso aos metodos da primeiraTela na segundaTela

basicamente isso

Editado para que fique mais facil de entender

Existe outra forma de fazer

crie uma classe de comunicação entre as telas

public class Integracao{

private  JList lista;


public void setList(JList suaLista){
   this.suaLista = lista;
}

public JList getList(){
   return lista;
}

}

na primeiraTela voce faz isso

Integracao integra = new Integracao();
integra.setList(suaLista);

na segundaTela vc recupera o valor fazendo isso

JList listaRecebeGet  // nao me lembro como criar o objeto Jlist
Integracao integraSegundaTela = new Integracao();
 listaRecebeGet = integraSegundaTela.getLista();

[color=red] Aos que possam reclamar: se vc der CTRL + C, CTRL + V NÃO irá FUNCIONAR os codigos, eu não testei e tambem não vou testar... o objetivo e passar a LOGICA de como fazer, entendido? [/color]

L
paty_trind:
oi, tenho uma tela com uma jlist de disciplinas e preciso adicionar em outra tela os modulos que correspondem a ou as disciplinas selecionadas e gostaria de saber como eu pego um item selecionado da jlist e como faço isto se ela esta em outra tela?!!! obrigada

Oi,

Encapsulamento?

public class Tela extends JFrame {

    //.... chamando a tela 2
    Tela2 secundaria = new Tela2();

   // Recebendo o valor da JList.
   secundaria.getValueListSelection();
}

No código da sua Tela2, teria um método chamado getValueListSelection() que retornaria o conteudo da lista selecionado.

Tchauzin!

P

obrigada Rafael!!
vou ajustar minhas telas aqui e qualquer coisa eu posto mas é exatamente isto que eu quero fazer!!!
:stuck_out_tongue:

P

gente não estou conseguindo !tipo eu fiz cmo o Rafael disseeuacho pelo menos
eu to usando modelos de jlist então este codigo eu fiz no modelo da 2 tela

Tela 1 tela; public tela2(Tela t) {this.tela=t; ..... resultado=comando.executeQuery("select modulo from aluno where disciplina='"+tela.getLista()+"'); ....

e este na tela 1 mesmo

public JLIst getLista() {return lista; }

ta dando nullpointerexceptin na linha de pesquisa no odelo da 2 tela
é pq eu fiz no modelo?
obg
=)

R

na tela1 na hora de criar a tela2 vc fez assim?

o NullPonteirExeption ocorre por tentar acessar um objeto que nao foi instanciado

poste seu codigo inteiro, e tente a segunda forma que postei acima no primeiro topico

outra coisa, para trabalhar com sql procure por PreparedStatement

outra coisa

isso não irá funcionar, pq a list é composta por varios elementos

tente fazer isso para vc entender

for(int x = 0; x < tela.getLista().size(); x++){
    System.out.println(tela.getLista().get(x));
}

dai vai mostrar o conteudo da lista

para fazer seu SQL vc vai ter que pegar cada valor da lista com o .get(index) e dai executar o sql

exemplo

for(int x = 0; x < tela.getLista().size(); x++){
    System.out.println(tela.getLista().get(x));

    resultado=comando.executeQuery("select modulo from aluno where disciplina='"+tela.getLista().get(x)+"');  

}
P

Rafa t tinhas razão eu so tinhadeclarado por isso tava dando nulllpointerexception mas olha so agora minha tela esta cm a jlist vazia tipo tm cmo eu selecionar primeiro as disciplinas e depoisa brir esta 2 tela?é q eu tinha criado um botão para depois q eu selecionasse as disciplinas aparecessem os modulos das mesmas na jlist da 2 tela
é possivel fazer assim ou eu prciso criar um jlist paracada disciplina?
mtooooooooo obrigada pela ajuda

R

para vc usar as informações da JList na segunda tela vc tem que carregar a lista com as informações antes de vc fazer o getList().

como assim selecionar as disciplinas??

vc tem que preencher a list antes de instanciar de usar o metodo getList()

como vc ta preenchendo a list?

R

posta o codigo se for possivel

P
oi meu codigo da primeira classe é este
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.ListModel;
import javax.swing.event.ListDataListener;

import jxl.format.Border;

/**Porque como os módulos são associados às disciplinas....
numa tela o usuário escolhe as disciplinas que o aluno irá fazer.
No outro, você mostra todos os módulos disponíveis para as disciplinas que ele selecionou.
Senão, vai ter que ficar controlando, toda vez que o usuário selecionar um módulo, 
a disciplina daquele módulo também terá que ser selecionada...***/
public class TelaDeDisciplinaModulo extends JFrame implements ActionListener{
	
	private static final long serialVersionUID = 1L;
	Container tela;
	JButton b,b1,b2;
	ArrayList<String> disciplinas=new ArrayList<String>();
	JList listaDeDisciplinas;
	
	public TelaDeDisciplinaModulo()
	{
		super ("Ensino Medio");   
		tela = getContentPane ();
		tela.setLayout(null); 


		try{
			b=new JButton("ok");
			b.setBounds(20, 240, 90, 25);
			b.addActionListener(this);
			listaDeDisciplinas=new JList(new ModeloDeLista());
			listaDeDisciplinas.setBounds(20, 30, 250, 250);	
			b.addActionListener (new ActionListener (){  
				public void actionPerformed(ActionEvent e)
				{
					java.awt.EventQueue.invokeLater (new Runnable () {   
						public void run () {   
							new TelaDeModuloDasDisciplinas().setVisible (true);   
						}  
					});

				}});
		}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			

			//tela.add(b);
			tela.add(listaDeDisciplinas);
			setSize(850,300);
			setVisible(true);     
			setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);     
			setResizable(true);
		
	}
	public ArrayList<String> getDisciplinas()
	{
		return disciplinas;
	}
	 public JList getLista()
	 {
		 return listaDeDisciplinas;
	 }

public static void main(String args[])
{
	java.awt.EventQueue.invokeLater (new Runnable () {   
		public void run () {   
			new TelaDeDisciplinaModulo().setVisible (true);   
		}  
	});
}

@Override
public void actionPerformed(ActionEvent arg0) {
	// TODO Auto-generated method stub
	
}
}

///aqui esta meu modelo de jlist
 class ModeloDeLista extends AbstractListModel
 {
	 	Connection conexao;
		Statement comando;
		ResultSet resultado;
		ArrayList<String> disciplinas;
		JList listaDeDisciplinas;
		
	 public ModeloDeLista()
	 {
		 try {
				conexao = conecta.conectabanco();
				comando = conexao.createStatement();
			}
			catch(Exception x) {
				JOptionPane.showMessageDialog(null, "Erro na conexÄo do banco");
			}

			try{
				disciplinas=new ArrayList<String>();
				
				resultado = comando.executeQuery("select distinct Id_disciplina from disc_modulo where ensino='"+1+"' order by Id_disciplina");
				while (resultado.next())
				{ 
					disciplinas.add(resultado.getString(1));	
				}
				listaDeDisciplinas=new JList();
			}
				catch(Exception e)
				{
					e.printStackTrace();
				}
	 }
	

	public void addDisciplina(String d) {
		
		disciplinas.add(d);
	}

	@Override
	public Object getElementAt(int index) {
			return disciplinas.get(index);
	}
	

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

	
	public void removeDisciplina(int l) {
	for(int i=0;i<disciplinas.size();i++)
	{
		if(i==l)
		{
			disciplinas.remove(i);
		}
	}
		
	}

	@Override
	public void addListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void removeListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub
		
	}
	 
 }
e este é o codigo da minha 2 tela com seu respectivo modelo
import java.awt.Container;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.event.ListDataListener;


public class TelaDeModuloDasDisciplinas extends JFrame{

	private static final long serialVersionUID = 1L;
	Container tela;
	JButton b,b1,b2;
	ArrayList<String> modulos=new ArrayList<String>();
	JList listaDeModulos;
	
	public TelaDeModuloDasDisciplinas()
	{
		super ("Modulos");   
		tela = getContentPane ();
		tela.setLayout(null); 

		try{
		
			listaDeModulos=new JList(new ModeloDeListaModulo(new TelaDeDisciplinaModulo()));
			listaDeModulos.setBounds(20, 30, 250, 250);	
			
		}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			tela.add(listaDeModulos);
			setSize(850,300);
			setVisible(true);     
			setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);     
			setResizable(true);
			
			
		
	}
	
	
	
	
	
	public static void main(String[] args) {
		java.awt.EventQueue.invokeLater (new Runnable () {   
			public void run () {   
				new TelaDeModuloDasDisciplinas().setVisible (true);   
			}  
		});
	}

}
class ModeloDeListaModulo extends AbstractListModel
{
	 	Connection conexao;
		Statement comando;
		ResultSet resultado;
		ArrayList<String> modulos;
		JList listaDeModulos;	
		TelaDeDisciplinaModulo td;
		
	 public ModeloDeListaModulo(TelaDeDisciplinaModulo t)
	 {
		 try {
				conexao = conecta.conectabanco();
				comando = conexao.createStatement();
			}
			catch(Exception x) {
				JOptionPane.showMessageDialog(null, "Erro na conexÄo do banco");
			}

			try{
				this.td=td;
				modulos=new ArrayList<String>();
				//onde a disciplina for o q estiver selecionado na jlist da tela de disciplinas e ver se tem q criar uma jlist
				//para cada um
				resultado = comando.executeQuery("select distinct modulo from disc_modulo where ensino='"+1+"'and disciplina='"+td.getLista()+"' order by modulo");
				while (resultado.next())
				{ 
					modulos.add(resultado.getString(1));	
				}
				listaDeModulos=new JList();
			}
				catch(Exception e)
				{
					e.printStackTrace();
				}
	 }

	public void addDisciplina(String d) {
		
		modulos.add(d);
	}

	@Override
	public Object getElementAt(int index) {
			return modulos.get(index);
	}
	

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

	
	public void removeDisciplina(int l) {
	for(int i=0;i<modulos.size();i++)
	{
		if(i==l)
		{
			modulos.remove(i);
		}
	}
		
	}

	@Override
	public void addListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void removeListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub
		
	}
	 
}
mtooo obg=)
R

pelo jeito a lista ta vazia pq vc nao está populando ela

a lista que vc tem que usar é esta disciplinas.add(resultado.getString(1));

esta lista vc tem que passar para a tela 2

ta abrindo a tela2 certinho com o modelo que te passei?? ta conseguindo ver o metodo getList da primeira tela apartir da tela2?

recomendo fortemente que vc separe seus codigos em classes diferentes e nao uma classe dentro da outra

R

rafaelviny:
pelo jeito a lista ta vazia pq vc nao está populando ela

a lista que vc tem que usar é esta disciplinas.add(resultado.getString(1));

esta lista vc tem que passar para a tela 2

ta abrindo a tela2 certinho com o modelo que te passei?? ta conseguindo ver o metodo getList da primeira tela apartir da tela2?

recomendo fortemente que vc separe seus codigos em classes diferentes e nao uma classe dentro da outra

mais uma coisinha

nao precisa do for to do para limpar a lista

use apenas isso

P

Rafa
mudei o meodo getLista na tela 1 e ficou assim

public ArrayList<String>getLista() {return disciplinas;}
agora os modulos aparecem mas sempreos mesmos tipo 1,2,3 sempre!
ah eu tnho q criar ua jlist para cada um(modulos)?
=(
ah e obg pelo conselho sobre uma classe na outra!

R

voce tem que tomar cuidado para nao enviar para a tela2 o list ( entenda-se list a JList ou ArrayList) antes de popular ele, o que provavelmente está acontecendo…

faz assim, antes de vc enviar apara a tela 2 faz ele imprimir na tela todos os valores da list que vc vai enviar

nao posso olhar detalhadamente seu codigo pq estou no meio da migração do ERP da empresa e to com meu tempo CURTISSSIMO, espero que entenda

reveja os meus post, eu editei todos colocando mais umas informações, mas vc ta indo no caminho certo, é so um detalhe que esta faltando

R

paty_trind:
Rafa
mudei o meodo getLista na tela 1 e ficou assim

public ArrayList<String>getLista() {return disciplinas;}
agora os modulos aparecem mas sempreos mesmos tipo 1,2,3 sempre!
ah eu tnho q criar ua jlist para cada um(modulos)?
=(
ah e obg pelo conselho sobre uma classe na outra!

é isso que a Jlist faz :smiley:

para vc pegar os modulos separados vc tem que fazer um for to do

String modulo = "";

for (int x = 0; x < lista.size(); x++){
   modulo = String.valueOf(lista.get(x));
}
P

ah este for vaitah dentro do try em q eu faço this.td=td; modulos=new ArrayList<String>(); for(....) resultado = comando.executeQuery("select distinct modulo from disc_modulo where ensino='"+1+"'and disciplina='"+td.getLista().get(i)+"' order by modulo"); while (resultado.next()) { modulos.add(resultado.getString(1)); } listaDeModulos=new JList(); //faço aki q tu me disseste agora=)

P

so mais uma coisa eu uso essa variavel modulo para add na tela tipo eu vo add ela?

R
JList novaLista = td.getLista(); // recupera lista da tela1, lembra de estanciar por completo senao da NullPointExeption
 for(int x=0; x<novaLista.size(); x++){  // ve o tamanho da lista e percorre ela ate o fim
                 resultado = comando.executeQuery("select distinct modulo from disc_modulo where ensino='"+1+"'and disciplina='"+novaLista.get(x)+"' order by modulo");  
                 while (resultado.next())  
                 {   
                     modulos.add(resultado.getString(1));   // se na sua lista vc tiver 2 disciplinas o sql vai ser executado para as 2   
                 }

tenta isso

R

nao, cada lista para uma utilidade

la no sql se vc quiser fazer o select por modulo tambem em vez da constante 1 vc vai ter que passar uma outra lista, so que dai a complexidade aumenta bastantinho, pq vc vai ter que classificar as listas…

ou usar um HashMap para mandar a materia e o modulo como se fosse uma tabela para fazer a verificação tipo assim:

modulo1, disciplina1
modulo1, disciplina2

ai vc vai ter que estudar

P

Rafa
olha so fiz o q tu disseste em relação a criação de uma nova lista mas ainda estão sendo exibidos os 3 modulos!
bah eu nãosei nada sobre hash map tmbm!
obg por toda ajuda
=)

R

faça assim, antes de usar no slq faça o for to do e mande imprimir para ver o que ta vindo

pelo que to vendo vc nao tem conhecimento suficiente sobre list, como popular, exibir, e excluir dados das mesmas

provavelmente vc esteja passando uma list sem dados por isso aparece null

P

bah pior q to começando a aprender sobre jlist :oops:
e realmente não sei mta coisa
mas olha so eu coloquei o system e apareceu todos os modulos cadastrados

R

e na hora de enviar para o sql vc que converter o tipo list para String

String nome;
for(int x = 0; x< lista.size(); x++){
nome = String.valueOf(lista.get(x));
  ... select disciplina where modulo = nome ; // observe que pego o valor da lista na posção X que está rodando no for, pq se eu pegar lista.get() vai retornar algo do genero [disciplina 1] [ disciplina 2]

... continua i tratamento do rs.next(){}
 
}
R
rafaelviny:
e na hora de enviar para o sql vc que converter o tipo list para String
String nome;
for(int x = 0; x< lista.size(); x++){
nome = String.valueOf(lista.get(x));
  ... "select disciplina where modulo ="+ nome ; // observe que pego o valor da lista na posção X que está rodando no for, pq se eu pegar lista.get() vai retornar algo do genero [disciplina 1] [ disciplina 2]

... continua o tratamento do rs.next(){}
 
}
P

Rafa to fazendo as alterações conforme tu disseste qualquer coisa eu posto e muito obrigadapela ajuda que tu estas me dando
-)

R

por nada, da uma pesquisada em JList, toda vez que ta dando para vir para meu pc to passando aqui…

pesquisa sobre como inserir dados em uma lista usando index e como recuperar usando index, nao precisa pesquisar muito, ja exemplifiquei tudo acima…

talvez seja apenas um probleminha de lógica de programação, como passar a String para o SQL no exemplo anterior

enquanto isso continuamos planejando a migração de parte do ERP 8)

P

agora os itens aprecem na tela dos modulos mas ao mesmo tempo porcausa do for tem como fazer um controle para q apenas as disciplinas selecionadas da jlist da tela 1 sejam utilizados na pesquisa dos modulos na tela 2?
obg=)

R

nao sei como vc esta selecionando esses campos.

outro jeito de pupular sua lista pode ser assim ( já que ta pegando todos os campos por causa do for)

OBS: logica inventada neste exato momento sem teste algum

// caso as disciplinas ou modulos (sei la qual)venham de um textfield com um actionListener


if(e.getSource() == jbAdicionaModuloLista){
  lista.add(tfModulo.getText(), lista.Size()+1);  // assim toda vez que vc clicar no botao adiciona o valor do textfield  na lista, "VALIDA para nao inserir valores nulos/vazios"
}
Criado 23 de março de 2011
Ultima resposta 24 de mar. de 2011
Respostas 27
Participantes 3