Procura em Jlist através da JcomboBox

2 respostas
O

Boas amigos,

eu tenho o seguinte programa:
[img]http://alojaimagens.com/images/605m5q2ollhctfnaronh.png[/img]

Ao qual já está quase acabado mas falta por os dois filtros a funcionar(Filtrar por divisao e filtrar por tipo) bem eu já tentei de tudo mas ainda não consegui, o codigo que tenho é muito extenso e não vou postar todo só o mais importante, passo a explicar.
Tenho 3 packages, no primeiro package estao as classes onde se criam os equipamentos, no segundo package estao as classes onde crio os metodos para os equipamentos, exemplo getDivisao, getNome etc, e no terceiro package estao 2 classes, o setup que cria inicia os equipamentos, e a JanelaPrincipal que é onde se faz tudo.

penso que para entenderem o basta verem os seguintes pedaços de codigo.
public abstract class DefaultEquipamento implements Equipamento{
	
	public static String TIPO;
	
	public static final String LIGADO = "ligado";
	public static final String DESLIGADO = "desligado";
	
	protected String nome;				// nome do equipamento
	protected boolean ligado = false;     // estado do equipamento
	protected String observacoes = "";    // observações do equipamento
	protected String divisao;				// em que divisão está instalado o equipamento
	protected JPanel controlo;
	
	public boolean isLigado(){
		return ligado;
	}
	
	public abstract void setLigado(boolean ligado);
		
	public String getObservacoes() {
		return observacoes;
	}
	
	public void setObservacoes(String observacoes) {
		this.observacoes = observacoes;
	}
	
	public String getTipo(){
		return TIPO;
	}
	
	public String getDivisao() {
		return divisao;
	}
	
	public void setDivisao(String divisao) {
		this.divisao = divisao;
	}
	
	public String getNome() {
		return nome;
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public abstract String[] getCapacidades();

	public abstract JPanel getControlo();

}
e assim adiciono os equipamentos e divisões:
String []divs = { "Sala", "Cozinha", "Jardim", "Quarto1", "Quarto2", "Quarto3"};
				for( String s : divs )
					janela.adicionarDivisao( s );
				// args[0] = nome
				// args[1] = tipo
				// args[2] = divisão
				// args[3] = observações
				// args[4] = estado inicial ("ligado"/"desligado")
				// args[5 e seguintes] = capacidades 				
				String [][]equips = { {"câmara da sala", Camara.TIPO, "Sala", "espia a sala", Camara.DESLIGADO },
									  {"câmara do jardim", Camara.TIPO, "Jardim", "vê o que se passa na rua", Camara.LIGADO, Camara.MOVEL_X, Camara.MOVEL_Y, Camara.ZOOM},
									  {"lâmpada do jardim", Lampada.TIPO, "Jardim", "Lãmpada do jardim", Camara.LIGADO},
									  {"lâmpada da cozinha", Lampada.TIPO, "Cozinha", "Lâmpada da cozinha", Camara.LIGADO},
									  {"lâmpada do quarto grande", Lampada.TIPO, "Quarto1", "Lâmpada do quarto grande", Camara.DESLIGADO, Lampada.REGULAVEL },
									  {"lâmpada do quarto da rapariga", Lampada.TIPO, "Quarto2", "Lâmpada do quarto da rapariga", Camara.DESLIGADO, Lampada.REGULAVEL },
									  {"lâmpada do quarto do rapaz ", Lampada.TIPO, "Quarto3", "Lâmpada do quarto do rapaz", Camara.DESLIGADO, Lampada.REGULAVEL },
									  {"ar condicionado da sala", ArCondicionado.TIPO, "Sala" , "Liberta ar e desumidifica a sala", ArCondicionado.LIGADO, ArCondicionado.REGULAVEL},
									  {"ar condicionado da cozinha", ArCondicionado.TIPO, "Cozinha" , "Liberta ar e desumidifica a cozinha", ArCondicionado.DESLIGADO, ArCondicionado.REGULAVEL},
									  {"ar condicionado do quarto grande", ArCondicionado.TIPO, "Quarto1" , "Liberta ar e desumidifica o Quarto1", ArCondicionado.DESLIGADO, ArCondicionado.REGULAVEL},
									  {"ar condicionado ddo rapaz", ArCondicionado.TIPO, "Quarto2" , "Liberta ar e desumidifica o Quarto2", ArCondicionado.LIGADO, ArCondicionado.REGULAVEL},
									  {"forno da cozinha",Forno.TIPO,"Cozinha","serve para fazer cozinhados", Forno.DESLIGADO, Forno.REGULAVEL},
									  {"máquina de roupa da cozinha", MaquinaRoupa.TIPO, "Cozinha", "Lava a Roupa", MaquinaRoupa.DESLIGADO, MaquinaRoupa.ECONOMICO,MaquinaRoupa.ENXAGUAR,
										  													MaquinaRoupa.LAVAR,MaquinaRoupa.SECAR,MaquinaRoupa.MEIACARGA,MaquinaRoupa.TIRARVINCOS,MaquinaRoupa.TORCER},
								      {"maquina roupa da cave", MaquinaRoupa.TIPO,"Cave","Lava Roupa",MaquinaRoupa.DESLIGADO,MaquinaRoupa.TORCER,MaquinaRoupa.LAVAR, MaquinaRoupa.ENXAGUAR, MaquinaRoupa.MEIACARGA}
						            };
				for( String []equip : equips )
					janela.adicionarEquipamento( equip );
			}
		});
o metodo para adicionar equipamentos é o seguinte:
public void adicionarEquipamento( String []args ){
		// ver se já há elementos com o mesmo nome
		try{	
			if( nomes.contains( args[0] ) );
		}
		catch(RuntimeException e){
			System.out.println("Nome " + args[0] + " já existe");
		}
		// ver se a divisão existe, senão dar erro
		try{
			if( !divisoes.contains(args[2]) );
		}
		catch ( RuntimeException e ){
			System.out.println("Divisão " + args[2] + " não existe");
		}
		// verificar e criar o equipamento certo
		criarEquipamento(args);
		// é um equipamento logo criá-lo e processar as capacidades
		defEquip.setDivisao( args[2] );
		defEquip.setObservacoes( args[3] );
		defEquip.setLigado( args[4].equals(DefaultEquipamento.LIGADO) );  // se for "ligado" é ligado senão é desligado		
			
		// adicionar aos equipamentos
		equipamentos.put( args[0], defEquip );
		// adicionar o nome aos equipamentos
		equipamentosListModel.addElement( defEquip.getNome() );
		//adicionar aos nomes dos equipamentos
		nomes.addElement(defEquip.getNome());
		
		// ver se a combobox dos tipos já a tem, senão coloca-a
		adicionarTipo();
	}
Bem o objectivo é quando eu selecciona a checkBox(Ex: Filtros por Divisao) e depois na Combobox Selecciona uma divisão(Ex: Sala) ele devolver-me os equipamentos que estão na sala. Este é um exemplo da classe de um equipamento os outros são bastante semelhantes, este equipamento é uma Lampada.
public class Lampada extends DefaultEquipamento {
	
	public static final String TIPO = "Lampada";
	// constantes com as capacidades suportadas por este aparelho 
	// com estas constantes reduz-se as hipóteses de erros por
	// manipulação de capacidades
	public static final String REGULAVEL = "regulavel";
	
	private boolean regulavel = false;  // se é ou não regulável
	private int nivel; 					// nível de luminosidade (0% a 100%)

	public Lampada( String nome ){
		this.nome = nome;
	}
	
	public boolean isLigado() {
		return ligado;
	}

	public void setLigado(boolean ligado) {
		this.ligado = ligado;
		// quando se liga/desliga isto vai colocar o nível no máximo ou mínimo
		nivel = ligado? 100: 0;
		// actualizar o controlo
		((LampadaControl)getControlo()).setLigado( ligado );
	}

	public String getObservacoes() {
		return observacoes;
	}

	public void setObservacoes(String observacoes) {
		this.observacoes = observacoes;
	}

	public int getNivel() {
		return nivel;
	}

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

	public boolean isRegulavel() {
		return regulavel;
	}

	public void setRegulavel(boolean regulavel) {
		this.regulavel = regulavel;
	}

	public String getDivisao() {
		return divisao;
	}

	public void setDivisao(String divisao) {
		this.divisao = divisao;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
		
	public String[] getCapacidades(){
		// se for regulável suporta a regulável senão não suporta nada
		if( isRegulavel() ){
			String []cap = { REGULAVEL };
			return cap; 
		}
		return new String[0];
	}
	
	public JPanel getControlo(){
		// se o controlo ainda não foi criado é preciso criá-lo		
		if( controlo == null )
			controlo = new LampadaControl( this );
		return controlo;
	}	
}

Gostava que me podessem ajudar visto isto ser um trabalho para a faculdade e só me faltar isso para acabar e era importante ir tudo a funcionar.

Cumprimentos

2 Respostas

Ivan_Alves

Uma dica e pegar a String da ComboBox caso ela esteja ativada e percorrer a lista de itens que você quer filtrar ai você fará uma condição if para filtrar os nomes da lista e guardar os nomes filtrados em uma lista auxiliar e então mostre-a na JList da sua tela.

Qualquer coisa avisa aí, flw!

O
Ivan Alves:
Uma dica e pegar a String da ComboBox caso ela esteja ativada e percorrer a lista de itens que você quer filtrar ai você fará uma condição if para filtrar os nomes da lista e guardar os nomes filtrados em uma lista auxiliar e então mostre-a na JList da sua tela.

Qualquer coisa avisa aí, flw!

A ComboBox fica activa assim que clicamos na checkbox, eu já fiz isto :

if (filtroDivisao.isSelected()){  
			String nome = (String)divisoesCB.getSelectedItem();    //divisoesCB é o nome da Combobox
                               if(nome.equals(Lampada.getDivisao()))   //não sei se será o mais correcto mas é o que me ocorre
                                     
                                       equipamentosListModel.addElement( ) // aqui teria que adicionar todas os sitios onde as lampadas estão presentes

Tem alguma sugestão?

Cumprimentos

Criado 3 de junho de 2011
Ultima resposta 3 de jun. de 2011
Respostas 2
Participantes 2